c++ 对象分配在栈上还是在堆上问题分析

 更新时间:2023年11月02日 11:24:07   作者:点墨  
这篇文章主要为大家介绍了c++ 对象在栈上还是在堆上问题分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

c++的对象到底在栈上还是分配在堆上?

首先,毋庸置疑,使用new和malloc系列函数分配的对象,一定是在堆上的。

Object *obj = new Object();

有争议的是

Object obj;

它是在栈上还是在堆上呢?

要回答这个问题,首先我们需要理解这句话的意思,这句话并不代表在栈上分配内存,它代表的是让obj具有“自动存储(automatic storage)”的性质。所谓的“自动存储”,意思是这个对象的存储位置取决于其声明所在的上下文。如果这个语句出现在函数内部,那么它就在栈上创建对象,此时obj变量和obj指代的对象(此时obj本质上其实是obj指代对象的首地址)都在栈上。

如果这个语句不是在函数内部,而是作为一个类的成员变量,则取决于这个类的对象是如何分配的。考虑下面的代码:

class Test{
    Object obj;
}
Test *test = new Test;

test指针是在栈上,它所指代的对象Test是存在堆上,那么obj变量和obj对象就在堆上。

class Test{
    Object obj;
}
Test test;

test变量在栈上,test对象在栈上,那么obj变量和obj对象就在栈上。

遵循这么一个原则:

指针变量和普通变量由上下文定义,指针所指向的内存在堆上,普通变量所指代的对象由上下文定义。

栈大小

栈大小是有默认值的,如果申请的临时变量太大就会超过栈大小,造成栈溢出。

它的默认值是可以修改的,一般,在unix-like平台,栈的大小是由环境变量控制的,所以不能通过设置编译器(像gcc)的任何编译标志来设置;在windows平台,栈的大小是包含在可执行文件里的,它可以在visual c++的编译过程中设置,但在gcc里是不可行的。

方法为:

项目->属性->链接器->系统->堆栈保留大小 (字节数)

在一般情况下,不同平台默认栈大小如下所示(仅供参考)

SunOS/Solaris 8172K bytes (Shared Version)
Linux 10240K bytes
Windows 1024K bytes (Release Version)
AIX 65536K bytes

演示

栈空间

代码

#include <iostream>
class Test {
public:
    Test() { std::cout << "Test" << std::endl; }
    ~Test() { std::cout << "~Test" << std::endl; }
private:
    char a[1024 * 1024];
};
class TestContainer {
public:
    TestContainer() { std::cout << "TestContainer" << std::endl; }
    ~TestContainer() { std::cout << "~TestContainer" << std::endl; }
private:
    Test test;
};
int main(int argc, char* argv[]) {
    TestContainer t;
    while (1) {}
    return 0;
}
  • 栈大小1MB(默认值),申请栈空间1MB

结果:程序崩溃,stack overflow

  • 栈大小1048577(1024*1024+1,即1MB多1B),申请栈空间1MB

结果:程序正常

堆空间

#include <iostream>
class Test {
public:
    Test() { std::cout << "Test" << std::endl; }
    ~Test() { std::cout << "~Test" << std::endl; }
private:
    char a[1024 * 1024];
};
class TestContainer {
public:
    TestContainer() { std::cout << "TestContainer" << std::endl; }
    ~TestContainer() { std::cout << "~TestContainer" << std::endl; }
private:
    Test test;
};
int main(int argc, char* argv[]) {
    TestContainer* t = new TestContainer;
    while (1) {}
    return 0;
}
  • 栈大小1MB,申请堆1MB
    结果:程序正常
  • 栈大小1MB,申请堆10MB
    结果:程序正常

以上就是c++ 对象分配在栈上还是在堆上问题分析的详细内容,更多关于c++ 对象堆栈分配的资料请关注脚本之家其它相关文章!

相关文章

  • C语言用easyx实现消砖块游戏

    C语言用easyx实现消砖块游戏

    这篇文章主要为大家详细介绍了C语言消砖块游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • VS Code如何编写C/C++程序的实现步骤

    VS Code如何编写C/C++程序的实现步骤

    本文主要介绍了VS Code如何编写C/C++程序的实现步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • C语言中各类指针的用法(小结)

    C语言中各类指针的用法(小结)

    这篇文章主要介绍了C语言中各类指针的用法(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • C 语言基础教程(我的C之旅开始了)[四]

    C 语言基础教程(我的C之旅开始了)[四]

    C 语言基础教程(我的C之旅开始了)[四]...
    2007-02-02
  • c++ TCHAR转string导致中文缺失或乱码问题及解决

    c++ TCHAR转string导致中文缺失或乱码问题及解决

    这篇文章主要介绍了c++ TCHAR转string导致中文缺失或乱码问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • OJ中G++和C++的区别

    OJ中G++和C++的区别

    今天小编就为大家分享一篇关于OJ中G++和C++的区别,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • C++编程中的函数指针初步解析

    C++编程中的函数指针初步解析

    这篇文章主要介绍了C++编程中的函数指针初步解析,函数指针在C语言和C++学习中都是非常重要的知识,需要的朋友可以参考下
    2016-04-04
  • c/c++中的左值右值详解

    c/c++中的左值右值详解

    这篇文章主要介绍了c/c++中的左值右值,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • C语言 位段的详细介绍

    C语言 位段的详细介绍

    这篇文章主要介绍了C语言 位段的详细介绍的相关资料,学习C语言基础的朋友,可以参考本文,需要的朋友可以参考下
    2016-11-11
  • 深入解析C++中的智能指针

    深入解析C++中的智能指针

    本文介绍了C++中RAII机制和智能指针的概念、使用及实现原理,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-10-10

最新评论