Я работаю с классом, для которого новый оператор был сделан частным, так что единственный способ получить экземпляр, чтобы написатьРазмер экземпляра класса
Foo foo = Foo()
Запись
Foo* foo = new Foo()
не работает.
Но потому, что я действительно хочу указатель на него, я имитировать, что со следующим:
Foo* foo = (Foo*)malloc(sizeof(Foo));
*foo = Foo();
так, что можно проверить, является ли нулевой указатель, чтобы узнать, есть ли уже инициализирована.
Похоже, что это работает, из эмпирических тестов, но возможно ли, что недостаточно было выделено пространством malloc? Или что-то другое становится забавным?
--- редактировать ---
А не говоря контекст, потому что я не был на самом деле уверен, о том, почему они были отключены новый оператор. Этот класс является частью библиотеки программирования ограничений (gecode), и я думал, что она может быть отключена для принудительного документированного способа указания модели.
Я не знал об идиоме типа данных конкретного типа, которая выглядит более правдоподобной причиной.
Эта схема размещения может быть прекрасной при указании стандартной модели --- в которой все указано как CDT в классе Space, но в моем случае каждый экземпляр создается определенными классами, а затем передается ссылаясь на конструктор класса, который воспроизводит модель.
О причине я не использую в
Foo f;
Foo *pf = &f;
было бы, как делать случай 1 ниже, который бросает «возвращающегося ссылку на локальную переменную» предупреждение
int& f() { int a=5; return a; } // case 1
int& f() { int a=5; int* ap=&a; return *ap; }
int& f() { int* ap=(int*)malloc(sizeof(int)); *ap=5; return *ap; }
это предупреждение исчезает при добавлении указателя в case 2, но я думаю, это потому, что компилятор теряет треки.
Так что единственный вариант левая случай 3 (не говоря уже о том, что дополнительно, ap
является членом класса, который будет инициализирован только один раз, когда е называется, будет аннулирована иначе, и это единственная функция, возвращающая ссылаясь на это. Я уверен, что ap
в этом случае потеряет смысл из-за того, что компилятор оптимизирует его (может случиться?)
Но я думаю, это слишком далеко выходит за рамки оригинала вопрос сейчас ...
Почему вы действительно хотите указатель на него? Не можете ли вы сделать что-то вроде Foo foo = Foo(); Foo * fooPtr = &foo; – Hogan
Возможно, я ошибаюсь, но делать это так странно для меня. Является ли 'delete' частным? В противном случае у вас будет явное 'delete' в вашем коде, но не 'new'. Это будет сложно отслеживать. – John
Почему вы просто не делаете '& foo', чтобы получить адрес объекта? почему вы хотите сделать «malloc»? – Naveen