创建一个没有“新”操作符的类的新实例

创建一个没有“新”操作符的类的新实例

问题描述:

只是一个简单的问题。正如标题所示,我只使用“new”运算符来创建一个类的新实例,所以我想知道另一种方法是什么以及如何正确使用它。创建一个没有“新”操作符的类的新实例

你也可以有你的类自动情况下,不使用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! 

要知道什么是投放新的,阅读这些常见问题解答:

+2

+1:我想知道*不是动态分配*的正确术语是什么。 *自动* - 谢谢! – 2011-05-04 15:16:34

+3

此外,要了解使用自动实例的优点,您需要了解[RAII](http://*.com/questions/712639/)。 – 2011-05-04 15:20:51

+0

'auto'变量有时也被称为'stack'变量。有多少程序员实际上使用'auto'关键字? – 2011-05-04 15:23:44

你可以只申报一个普通变量:

YourClass foo; 
+1

假设它有一个默认的构造函数。 – Nick 2011-05-04 15:14:40

+0

我在哪里可以找到关于“正常变量”的更多信息? – 2016-01-05 13:03:54

不应使用new创建C++中的大多数对象。当你需要创建的对象的数量

class Person { 
    ... 
}; 


int main() { 
    int x = 3; 
    boolean b = true; 
    Person p("fred"); 
} 

创建新的对象应保留的场合,当你需要多态,或可能:相反,你应该以同样的方式,你将创建整数或布尔创建它们,但在编译时你不知道有多少。

+1

不,关于如何创建对象的决定取决于对象应该生存多长时间。如果它只存在于给定函数的范围和生命周期内,那么将其作为一个'auto'局部变量是有意义的。如果它必须存在于函数执行之外,则需要动态分配。还有的创建多少个对象的问题,即,而是具有单个实例它们的列表或数组。 – 2011-05-04 15:20:31

+0

一点也不 - 我可以在一个函数创建一个实例,并通过复制,它返回到调用函数,我会为一个整数的一个实例。做你写的回报的std ::字符串通过指针返回它们的全部功能? – 2011-05-04 15:23:11

+0

这听起来像你真的喜欢复制对象... – 2013-06-30 20:52:46

使用malloc会给你新的结果,只是不调用构造函数。

+0

不完全错误的,所以没有-1 ...这只有在构造函数什么都不做类没有任何虚方法有点正确? – 2011-05-05 04:48:29

任何常用的方法:作为本地或静态变量,或作为临时的。一般而言,当对象具有标识并且生命周期不对应于作用域或其多态时,在C++中使用new的唯一时间为 。 (当然有 例外,但不是很多。)如果对象可以复制 ,通常最好使用本地实例,根据需要复制 。 (就像你会为int,其实。)