在堆栈/堆上创建对象
creating object on stack/heap
我有两段代码来创建一个A对象
A* a=new A();
和
A b;
A *c=&b;
问题是:有人说"对象总是在堆上分配"?
在栈上声明它是真的吗?(代码1)
注意:我指的是实际的内存分配。我知道对象'b'将是
在超出作用域时被清除。但是当
仍然在作用域中时, 在哪里?内存'b'实际上驻留?
指针a
在堆栈上,它指向的A
实例在堆上。
对象b
在栈上,指针c
在栈上
@LouisTan这取决于这些代码行在程序中的位置。但是一般情况下,这个指针会在Stack上。
比较:
/* my.c */
char * str = "Your dog has fleas."; /* 1 */
char * buf0 ; /* 2 */
int main(){
char * str2 = "Don't make fun of my dog." ; /* 3 */
static char * str3 = str; /* 4 */
char * buf1 ; /* 5 */
buf0 = malloc(BUFSIZ); /* 6 */
buf1 = malloc(BUFSIZ); /* 7 */
return 0;
}
- 这既不是在堆栈上分配也不是在堆上分配。相反,它被分配为静态数据,并放在大多数现代机器上自己的内存段中。实际的字符串也被分配为静态数据,并在思维正常的机器中放入只读段。
- 是一个静态分配的指针;一个地址的房间,在静态数据。
- 在堆栈上分配了指针,当
main
返回时,该指针将被有效地释放。字符串,因为它是一个常量,被分配在静态数据空间与其他字符串。 - 的实际分配与2完全相同。
static
关键字告诉您,它不是在堆栈上分配的。 - …但是
buf1
在堆栈上, - …malloc'ed buffer space在堆上
- 顺便说一下。孩子们不会在家里尝试这个。
malloc
具有感兴趣的返回值;总是检查返回值。
查看这里完整的Charlie Martin post
作为一般的经验法则:
如果您使用任何类型的动态内存分配(new, array new, malloc等),分配的对象将位于堆上。
在局部范围内(使用堆栈内存)创建对象是完全可能的,正如您在第二个代码片段中所示。
第一个代码片段使用堆内存创建对象A。
相关文章:
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何创建对象函数指针C++映射?
- C++创建对象数组
- 在 C++ 的 Switch Case 中创建对象后对对象调用方法
- 如何获取在 main() 函数中构造的类的创建对象?
- 基于文件中的条目创建对象
- 如何在构建对象堆栈时解决转换错误?
- 堆还是堆栈用于创建对象?
- 在堆和堆栈中创建对象的差异
- 在堆栈上创建对象的不同方法
- C++:如何在循环中的堆栈上创建对象
- 在堆栈中创建对象时,即使代码覆盖率为100%,函数覆盖率也较小
- 如何使用在另一个类的构造函数中的堆栈上接受参数的构造函数创建对象
- 在堆栈上创建对象
- 在堆栈上创建对象时分配的内存在哪里
- 在堆栈/堆上创建对象
- 何时在堆与堆栈中创建对象
- 将引用分配给新创建的堆栈分配对象时会发生什么
- 在堆栈/堆上创建对象
- 在堆栈上创建对象矢量?(c++)