创建一个没有“新”操作符的类的新实例
你也可以有你的类自动情况下,不使用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,与新略有不同。 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!
要知道什么是投放新的,阅读这些常见问题解答:
- What is "placement new" and why would I use it?(在parashift.com FAQ)
- placement new(在stackoverflow.com FAQ)
你可以只申报一个普通变量:
YourClass foo;
假设它有一个默认的构造函数。 – Nick 2011-05-04 15:14:40
我在哪里可以找到关于“正常变量”的更多信息? – 2016-01-05 13:03:54
不应使用new创建C++中的大多数对象。当你需要创建的对象的数量
class Person {
...
};
int main() {
int x = 3;
boolean b = true;
Person p("fred");
}
创建新的对象应保留的场合,当你需要多态,或可能:相反,你应该以同样的方式,你将创建整数或布尔创建它们,但在编译时你不知道有多少。
不,关于如何创建对象的决定取决于对象应该生存多长时间。如果它只存在于给定函数的范围和生命周期内,那么将其作为一个'auto'局部变量是有意义的。如果它必须存在于函数执行之外,则需要动态分配。还有的创建多少个对象的问题,即,而是具有单个实例它们的列表或数组。 – 2011-05-04 15:20:31
一点也不 - 我可以在一个函数创建一个实例,并通过复制,它返回到调用函数,我会为一个整数的一个实例。做你写的回报的std ::字符串通过指针返回它们的全部功能? – 2011-05-04 15:23:11
这听起来像你真的喜欢复制对象... – 2013-06-30 20:52:46
使用malloc会给你新的结果,只是不调用构造函数。
不完全错误的,所以没有-1 ...这只有在构造函数什么都不做类没有任何虚方法有点正确? – 2011-05-05 04:48:29
任何常用的方法:作为本地或静态变量,或作为临时的。一般而言,当对象具有标识并且生命周期不对应于作用域或其多态时,在C++中使用new
的唯一时间为 。 (当然有 例外,但不是很多。)如果对象可以复制 ,通常最好使用本地实例,根据需要复制 。 (就像你会为int
,其实。)
+1:我想知道*不是动态分配*的正确术语是什么。 *自动* - 谢谢! – 2011-05-04 15:16:34
此外,要了解使用自动实例的优点,您需要了解[RAII](http://stackoverflow.com/questions/712639/)。 – 2011-05-04 15:20:51
'auto'变量有时也被称为'stack'变量。有多少程序员实际上使用'auto'关键字? – 2011-05-04 15:23:44