c++: volatile遇到类的非默认构造,一下就把栈给爆掉了

GKatHere 2024-11-21 01:10:02
// vs2022, c++ 14,
struct  volatileB
{
public:
	int a;
	char m[0x300000];
	volatile int va = 0;
};
struct volatileA
{
	volatileB vbb{ 1 };
};


int main()
{
	std::cout << "Hello World!\n";
    //  即使是用new在堆上分配
    //      volatileA的构造函数,仍然需要使用超过其结构大小的栈
	volatileA* va = new volatileA;

	getchar();
}

 

...全文
133 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
forever74 11-25
  • 打赏
  • 举报
回复

厨房刀具,锋利是它的优点,能切到手是用刀的人的责任,不是刀的毛病。

  • 打赏
  • 举报
回复

实测用gcc 9.2编译正常运行,32、64位都没问题~

  • 举报
回复
@日立奔腾浪潮微软松下联想 g++需要打开堆栈检查
@真相重于对错 打开或者不打开(默认没有打开)都运行正常
GKatHere 11-22
  • 举报
回复
@日立奔腾浪潮微软松下联想 没用到gcc测试。也有可能是vs问题
  • 打赏
  • 举报
回复

提供构造函数

GKatHere 11-21
  • 举报
回复
@真相重于对错 try it
  • 举报
回复
@GKatHere struct volatileA { volatileB vbb{ 1 }; }; 你这段代码没提供 构造函数,编译器会直接给你提供一个,而vbb{1} ,会放到他提供的构造函数里面,而vbb又有一个大的数组,在执行这个构造函数时就会爆栈
GKatHere 11-22
  • 举报
回复
@真相重于对错 struct volatileB { public: char m[0x300000]; volatile int va = 0; int a; volatileB(int a_):a(a_) {} }; struct volatileA // 这样不行 { volatileB vbb{1}; volatileA(){}; }; struct volatileA_2 // 这样可以 { volatileB vbb; volatileA_2():vbb(1){}; }; int main() { volatileA_2* va_2 = new volatileA_2; // 这里可以 std::cout &lt;&lt; "va_2;"; // 即使是用new在堆上分配 // volatileA的构造函数,仍然需要使用超过其结构大小的栈 volatileA* va = new volatileA; // 这里不行 std::cout &lt;&lt; "va_1;"; getchar(); } 难道这就是vs社区版免费的原因。
1条回复

65,108

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧