类实例的大小

Gzo*_*org 2 c++

我正在使用一个已经将new运算符设为私有的类,因此获取实例的唯一方法是编写

Foo foo = Foo()
Run Code Online (Sandbox Code Playgroud)

写作

Foo* foo = new Foo()
Run Code Online (Sandbox Code Playgroud)

不起作用.

但是因为我真的想要一个指向它的指针,我用以下方法模拟它:

Foo* foo = (Foo*)malloc(sizeof(Foo));
*foo = Foo();
Run Code Online (Sandbox Code Playgroud)

这样可以测试指针是否为null,以确定是否已经初始化.

从经验测试来看,它看起来很有效,但是malloc可能没有分配足够的空间吗?或者其他东西变得有趣?

---编辑---

A没有提到上下文,因为我实际上并不确定新运算符被禁用的原因.这个类是约束编程库(gecode)的一部分,我认为可以禁用它以强制指定模型的文档化方式.

我不知道混凝土数据类型的习语,这看起来更合理.

在指定标准模型时,该分配方案可能没有问题 - 其中所有内容都在空间派生类中被指定为CDT--但在我的情况下,这些实例都是由特定类创建的,然后通过引用传递给表示模型的类的构造函数.

关于我没有使用的原因

Foo f;
Foo *pf = &f;
Run Code Online (Sandbox Code Playgroud)

这就像做下面的情况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; }
Run Code Online (Sandbox Code Playgroud)

在案例2中添加指针时,此警告消失,但我想这是因为编译器丢失了轨道.

因此,剩下的唯一选择是案例3(没有提到另外一个,ap是一个类的成员,只有在调用f时才会初始化一次,否则将为null,并且是唯一返回对它的引用的函数.这样,我确信ap在这种情况下,由于编译器优化它而失去意义(可能会发生吗?)

但我想这远远超出了原来问题的范围......

Joh*_*ing 8

不要malloc与C++类一起使用. malloc不同于调用类的构造函数new的非常重要的方面new,但malloc不是.

您可以通过几种方式获得指针,但首先要问问自己为什么?您是否尝试动态分配对象?你是否试图将指针传递给其他函数?

如果你传递指针,你可能最好不要传递引用:

void DoSomething(Foo& my_foo)
{
  my_foo.do_it();
}
Run Code Online (Sandbox Code Playgroud)

如果你真的需要一个指针(也许是因为你无法改变它的实现DoSomething),那么你可以简单地将指针指向一个自动:

Foo foo;
DoSomething(&foo);
Run Code Online (Sandbox Code Playgroud)

如果你需要动态分配Foo对象,事情会变得有点棘手.有人做了这个new操作private是有原因的.可能是一个非常好的理由.可能有一个工厂方法Foo:

class Foo
{
public:
  static Foo* MakeFoo();
private:
};
Run Code Online (Sandbox Code Playgroud)

..在这种情况下你应该称之为.否则你将不得不编辑Foo自己的实现,这可能不是一件容易的事情或者是一件好事.