Will instantiating a class without the `new` keyword cause its internal variables to be created on the stack, or the heap?
(C++中)将实例化一个类,而不使用EDCOX1的0个关键字,因为如果在类的构造函数中使用EDCOX1的0个关键字来定义它们的内部变量,或者它们会在堆上创建,那么它的内部变量将被创建在堆栈上。
换句话说,如果我们有一个类或结构包含一个使用
if we have a class or struct that contains a variable (an array for
example) declared inside its constructor using the new keyword, will
creating an instance of this class without using new cause the
internal array to be created on the stack, or the heap?
是的,即使您在堆栈上创建了一个对象(没有
1 2 3 4 | int main() { int* t = new int[100]; // pointer is on stack, data on the heap //... } |
类似地:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class A{ public: A(){ int* t = new int[100]; std::cout<<"heap used "; delete t; } }; int main(int argc, char** argv) { A a1; // ... } |
印刷品:
heap used
实际上,已经在免费商店中分配(并删除)了100个
如果需要指定内存位置,可以使用新的放置:
1 2 3 | char buf[1024]; string* p = new (buf) string("on stack"); // pointer is on stack, // data on the stack |
考虑以下代码,不假设优化:
1 2 3 4 5 6 7 8 9 10 11 | struct Foo { int* pointer_to_int; Foo() : pointer_to_int(new int) { } ~Foo() { delete pointer_to_int; } } void func() { Foo some_foo; Foo* some_other_foo = new Foo; } |
将在堆栈上分配
由于使用了
在这两种情况下,在foo的构造函数中创建的
operator new在堆中分配内存,除非使用placement new运算符,您可以将对象使用的内存指向该运算符。
除了
- 普通新建(在堆上分配)
- 放置新语法(已分配内存)
…还有另一个使用
结论(编辑评论)
因此,即使使用
- 在堆上(这是默认行为)
- 在已存在的内存中(放置新语法)
- 如果用户愿意,也可以在其他任何地方(通过重载new)
这些新选项返回的地址可以存储在调用进程(堆栈、堆或数据段)的地址空间的任何位置。
使用
不使用
顺便说一下,函数中的