【问题标题】:C++ Instantiate class from static functionC++ 从静态函数实例化类
【发布时间】:2012-05-07 15:39:57
【问题描述】:

我正在尝试从静态成员函数实例化一个对象。我已经定义了:

class A
{
public:
    A( );
    A(int aParam);
    ~A( );
    static A* Creator( );
private:
    int m_nData;
};

并实施:

#include "A.h"

A::A()
{
}

A::A(int aParam)
{
    m_nData = aParam;
}

A::~A()
{
}

A* A::Creator()
{
    return new A(0);
}

可以,但删除对象时出现问题:

#include "A.h"
#include <stdio.h>

int main(int argc, char** argv)
{
    A* pointer = A::Creator();

    delete pointer;
    return 0;
}

此示例按预期工作。我担心问题可能会更复杂。我将尝试提供更多详细信息: 我在 dll 库 (Windows) 中有一个类似于此处描述的类。当我从程序中调用静态函数时,出现错误(调试时): HEAP [program.exe]:指定给 RtlValidateHeap 的地址无效(0000000000BA0000, 000000000264B3D0) Windows 已在 program.exe 中触发断点。

这可能是由于堆损坏,这表明 program.exe 或其已加载的任何 DLL 中存在错误。

根据我的测试,似乎新创建的对象正在堆栈中分配。

任何帮助将不胜感激。

【问题讨论】:

  • 这甚至无法编译,请发布可编译的解决方案。
  • 您发布的代码唯一的问题是缺少析构函数定义和几个语法错误。除非在最极端的情况下,否则这将导致链接器错误。你没有显示的东西是你崩溃的罪魁祸首。
  • 我预计还有其他问题。该对象肯定是在堆上分配的,您展示的最小示例应该可以正常工作。这个确切的示例是否以某种方式失败,或者您是否错过了简化发布的重要细节?
  • -1 不是实际代码(在发表此评论时)。
  • 请发布一个完整的、最小的、自包含的示例来展示您的问题。

标签: c++ static instantiation delete-operator


【解决方案1】:

我认为您缺少析构函数的实现。编译器应该警告你。使用 gcc 和前面提到的修复,它可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    相关资源
    最近更新 更多