【发布时间】:2011-08-18 15:25:41
【问题描述】:
只是一个简单的问题。正如标题所示,我只使用“new”运算符来创建类的新实例,所以我想知道其他方法是什么以及如何正确使用它。
【问题讨论】:
只是一个简单的问题。正如标题所示,我只使用“new”运算符来创建类的新实例,所以我想知道其他方法是什么以及如何正确使用它。
【问题讨论】:
你可以只声明一个普通变量:
YourClass foo;
【讨论】:
您还可以拥有不使用new 的类的自动 实例,例如:
class A{};
//automatic
A a;
//using new
A *pA = new A();
//using malloc and placement-new
A *pA = (A*)malloc(sizeof(A));
pA = new (pA) A();
//using ONLY placement-new
char memory[sizeof(A)];
A *pA = new (memory) A();
最后两个使用placement-new,这与new略有不同。 Placement-new 用于通过调用构造函数来构造对象。在第三个例子中,malloc 只分配内存,不调用构造函数,所以使用 placement-new 调用构造函数来构造对象。
还要注意如何删除内存。
//when pA is created using new
delete pA;
//when pA is allocated memory using malloc, and constructed using placement-new
pA->~A(); //call the destructor first
free(pA); //then free the memory
//when pA constructed using placement-new, and no malloc or new!
pA->~A(); //just call the destructor, that's it!
要了解什么是新展示位置,请阅读以下常见问题解答:
【讨论】:
auto 变量有时也称为stack 变量。到底有多少程序员实际使用auto 关键字?
memory 不能保证与 A 对象正确对齐。
使用 malloc 将得到与 new 相同的结果,只是无需调用构造函数。
【讨论】:
任何常用方式:作为局部变量或静态变量,或作为
一个临时的。一般来说,您在 C++ 中使用 new 的唯一时间是
当对象具有身份和生命周期时
对应一个范围,或者当它是多态的。 (有
例外,当然,但不多。)如果对象可以
复制,通常最好使用本地实例,复制
那些需要的。 (事实上,就像你对int 所做的那样。)
【讨论】: