Вот (искусственный) пример использования функции, которая возвращает анонимную структуру и делает «что-то» полезное:
#include <iostream>
template<typename T>
T* func(T* t, float a, float b) {
if(!t) {
t = new T;
t->a = a;
t->b = b;
} else {
t->a += a;
t->b += b;
}
return t;
}
struct {
float a, b;
}* foo(float a, float b) {
if(a==0) return 0;
return func(foo(a-1,b), a, b);
}
int main() {
std::cout << foo(5,6)->a << std::endl;
std::cout << foo(5,6)->b << std::endl;
void* v = (void*)(foo(5,6));
//[1] delete f now because I know struct is floats only.
float* f = (float*)(v);
std::cout << f[0] << std::endl;
std::cout << f[1] << std::endl;
delete[] f;
return 0;
}
Есть несколько моментов, которые я хотел бы обсудить:
- Как видно, этот код имеет утечку, в любом случае я не могу утечь, не зная, что такое базовое определение структуры? см. комментарий [1].
- Мне нужно вернуть указатель на анонимную структуру, чтобы я мог создать экземпляр объекта в шаблонной функции
func
, могу ли я сделать что-то подобное, не возвращая указатель? - Я думаю, самое главное, есть ли вообще ЛЮБОЕ (реальное) применение для этого? Поскольку пример, приведенный выше, протекает и, по общему признанию, надуманный.
Кстати, функция foo(a,b)
возвращает структуру, содержащую два числа, сумму всех чисел от 1 до а и произведение а и b.
Возможно, строка new T
могла бы как-то использовать boost::shared_ptr, чтобы избежать утечек, но я этого не пробовал. Будет ли это работать?
Я думаю, что просто пытался удалить анонимную структуру как массив с плавающей запятой, что-то вроде float* f = new float[2]. Что может быть неправильным, как предполагает комментарий ниже, так что же можно сделать? можно ли вообще удалить?
Я могу скомпилировать и запустить этот код «как есть» на VS2008, возможно, некоторые нестандартные расширения могут использоваться VS, но он работает и дает 15 и 30 в качестве ответа.
Судя по ответам, я считаю, что это приспособление является специфичным для VS2008, оно не соответствует стандартам и, следовательно, не переносимо. Жаль, однако, мне бы хотелось увидеть, какое колдовство придумали люди Stackoverflow или Boost, если бы это было в их арсенале :). Спасибо всем.
delete[]
в памяти, выделенной с помощьюnew
? ОЙ! - person vladr   schedule 08.04.2010