Loading

为什么实例化class报错segmentation fault而指针不会

问题

做单元测试的时候遇到一个奇怪的问题

class Evaluator
{
public:
    explicit Evaluator(){};
    // ...
}

Evaluator eval; // segmentation falut
std::unique_ptr<Evaluator> eval_ptr = std::make_unique<Evaluator>(); // OK

只要调用构造函数函数就会报错,而智能指针则没有问题。

思考

考虑到生产代码中确实是用智能指针进行构造,想必两种构造方式有区别。
从字面意思理解segmentation falut表示程序访问了不该访问的内存,常见于空指针或越界。
可能是Evaluator的长度过大,超过了stack的上限进而产生错误,验证一下。
果然sizeof(Evaluator)的返回值高达9450736妥妥stack overflow越界。
使用指针初始化产生heap中的匿名变量,对应stack仅存储一个长整数代表的地址因此不会溢出。

参考

C++ variables and where they are stored in memory (stack, heap, static) - Stack Overflow

posted @ 2022-12-13 15:16  azureology  阅读(52)  评论(0)    收藏  举报