我应该何时使用new-operator
?
在我的例子中,我使用两种不同的方法得到相同的结果:
#include <iostream>
int main() {
int *p1;
int n1 = 5;
p1 = &n1;
int *p2;
p2 = new int;
*p2 = 5;
std::cout << *p1 << std::endl;
std::cout << *p2 << std::endl;
return 0;
}
答案 0 :(得分:1)
使用动态分配的内存的目的是以下一个(或多个)
new
手动创建,并由delete
根据用户的意愿手动销毁。在您的具体示例中,这些原因都不适用,这意味着在那里使用动态内存毫无意义。
答案 1 :(得分:1)
考虑到最近的C ++ 11和即将推出的C ++ 14标准,你应该在使用垃圾收集的语言编程时使用new运算符,例如Java或C#。这些语言很自然。但是在现代C ++中,您可以(并且通常应该)避免直接分配内存。我们现在有一套很好的智能指针。
答案 2 :(得分:0)
如果要从堆中分配,而不是堆栈,请使用new。或者提升一个抽象层次。在您需要分配的内存后,使用new,在分配了它的函数(更合适的范围)之后(在线程的情况下)已经退出。
答案 3 :(得分:0)
当您希望对象保持存在直到您删除它时,您应该使用new。如果不使用new,那么当对象超出范围时,该对象将被销毁。
有些人会说使用new决定你的对象是在堆还是堆栈上,但这只适用于在函数中声明的变量。
使用'new'分配(和释放)对象比在原地分配对象要昂贵得多,因此必须将其限制在必要的范围内。
答案 4 :(得分:0)
在这段代码中,你会处理内存,但需要自动内存。编译器会为您选择存储每个变量的位置。您p1
指向n1
,但大部分工作都是自动完成的。
int *p1;
int n1 = 5;
p1 = &n1;ou
但是在下一段代码中,您请求动态分配int
int *p2;
p2 = new int;
*p2 = 5;
这里你创建了一个动态存储的新整数,因此你也应该删除它,否则你已经创建了第一个内存泄漏。如果您动态分配,则必须注意在使用后将其删除。
delete p2;
当你开始使用new do delete分配内存时,这是最大的差异,否则对象实例的解构将无法运行,因此无法清除已分配的内存。
答案 5 :(得分:0)
int * p2 = new int;
新的int部分告诉程序你想要一些适合持有的新存储 运算符使用该类型来确定需要多少字节。 然后它找到内存并返回地址。接下来,将地址分配给p2,即 声明为指向int的类型。现在p2是地址,* p2是存储的值 那里。将此与将变量的地址分配给指针进行比较:
int n1;
int * p1 = &n1;
在这两种情况下(p1和p2),都将int的地址分配给指针。在第二 case,您还可以通过名称访问int:p1。在第一种情况下,您唯一的访问是通过指针。 请记住,您应该使用delete来释放由新
分配的内存delete p2;
你需要阅读一些好书...... 我认为“C ++ Primer plus”对你来说是一个很好的