What does the 'new' keyword do in c++?
Possible Duplicates:
When to use “new” and when not to, in C++?
When should I use the new keyword in C++?
A a;和A a = new A();之间有什么区别?
编辑:
我的错。
-
我们需要A的定义。如果A没有默认构造函数,那么应该解释什么?两者都是无效的,并且标记任何差异都没有意义。如果A有一个A*和一个默认的ctor,或者A是void*,则两者都有效。我们不能完全详细地描述语义。这就是书的用途。
-
@Johannes:你是迂腐的。你必须尝试在中途遇到提问者。关于SO的很多问题都可以回答,"我不知道将会发生什么,这取决于你没有向我们展示的许多因素,"但这没有用。你被允许做出合理的假设。
-
@Ned pedantry就是编程的全部。
-
@Ned我学会了认真对待问题并停止做出假设。对于那些不太了解语言的人来说,你做出的假设并不一定是显而易见的。如果有人不知道这方面的语言并搜索谷歌,他/她可能会逐字地阅读这个问题。
-
@Johannes:所以你以OP为代价优化了对未来搜索者的回答?很奇怪。同时你假设A首先是一个定义的类。如果A是一个宏,这个代码可以做任何事情!如果这个代码已经逐字地提供给C ++编译器,那么它会抱怨A是未定义的。如果你不那么认真地对待问题,你会帮助更多的人。
-
@Johannes:你肯定是对的(这就是为什么我删除了我的答案),但请记住,当你处理像C这样有预处理器的语言时,你几乎不可能确定你所看到的是什么是实际发生的事情。 @Ned有一个很好的观点。
-
@Ned Everywere在沟通时,有假设。整个问题是,你有多少假设。根据我的口味,在这种情况下它明显越过边界。
-
实际上,我的观点是讽刺地试图指出"你没有告诉我们我们需要知道的一切"的荒谬之处......
-
@Johannes,虽然我同意Ned这有点迂腐,但我确实尝试添加这样一个事实:默认构造函数被调用到我的答案中,并且我的答案中的代码都没有编译而没有A的默认构造函数。
-
@Mehrdad,我不同意这个,这是微妙的不同。
在函数内部时,
在堆栈上声明一个变量,并在a上调用A的默认构造函数*。当变量超出范围时,将自动清除此变量。
但是,不会编译
在堆上创建一个新的A,并在新分配的内存上调用A的默认构造函数*。然后表达式依次求值为指向新A的指针,变量a初始化为。您负责管理此内存,因此您需要确保稍后使用delete删除它:
否则你会有内存泄漏
请参阅此问题以了解有关堆栈和堆之间差异的更多信息。
*如果A没有默认构造函数,则不会编译此代码。默认构造函数由您定义或由编译器隐式提供。有关默认构造函数的更多信息,请参见此
道格T:
A a declares a variable on the stack.
不正确:A a声明一个变量并为其分配内存,无论是在堆栈上还是在全局内存空间中,具体取决于它具有的范围。
还要考虑内存中的位置
位于(全局内存空间 - 不是堆栈,不是堆)。
第二个是无效的。 new分配空间并返回指针。使用A * a = new A();