Timothy6 2020-04-17 22:51 采纳率: 0%
浏览 232

求大佬解答:关于C++构造函数和析构函数清栈的问题!

类A和它的构造函数,采用__cdecl方式:

class A

{

__cdecl A() {}

};


VS2019会给出警告:warning C4166: 构造函数/析构函数的非法调用约定,
如果改成 class A { __stdcall A() {} };,就不会产生任何警告,貌似构造函数和析构函数不能是__cdecl
不过在gcc上编译却不会给出警告,

但是 调用反汇编会发现,即使构造函数强行声明为__cdecl,生成的构造函数的反汇编仍然含有ret,即仍然是__stdcall的。
这说明,构造函数是不能为__cdecl的

求助大佬原因

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-25 14:30
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    构造函数和析构函数在C++中不能使用__cdecl。这是因为在大多数现代操作系统中,函数调用的栈帧都是不可变的,并且每个函数都有一个特定的大小。如果函数是__cdecl,那么它将占用比其他函数更多的栈空间。这可能会导致内存泄漏或其他性能问题。

    在C++标准库中,没有提供直接支持__cdecl的构造函数或析构函数的方法。不过,你可以通过重载不同的operator new()operator delete()来模拟这个功能。

    例如:

    template <typename T>
    class MyClass {
    public:
        MyClass() : m_data(new T) {}
        
    private:
        T* m_data;
    };
    
    // 使用
    MyClass<int> my_int;
    

    在这个例子中,我们创建了一个MyClass对象,它可以动态分配并释放一个整数类型的存储空间。注意,这里的构造函数和析构函数都具有__cdecl形式。

    然而,这种方法并不总是理想的选择,因为可能会影响到你的程序的其他部分。如果你确实需要这样的行为,你可能需要考虑使用一些特殊的库或者修改你的代码以适应这种需求。

    评论

报告相同问题?