std :: vector析构函数给出错误

时间:2014-04-19 19:27:24

标签: c++ class memory vector destructor

我有一个这样的课程:

class Foo
{
public:
    Foo() {};

    ~Foo() {};

    void MyFunc(int a)
    {
        m_struct.my_vec.push_back(a);
    }

public:
    MyStructType m_struct;
}

和MyStructType的定义类似于:

struct MyStructType
{
    std::vector<int> my_vec;
}

问题是当我按如下方式实例化类时,当调用m_struct析构函数时,我得到std :: vector deallocation的内存冲突错误:

void main()
{
    Foo f;
    f.m_struct.my_vec.push_back(10);
}

但是,如果我按照以下方式进行,结果是一样的,但我没有收到任何错误:

int main()
{
    Foo f;
    f.MyFunc(10);
}

对我来说,这两种方法应该是相同的。鉴于实际代码比上面的代码片段更复杂,我更愿意将m_struct设为public并使用第一个选项。有关为什么第一种方法在释放vector时会出错的任何建议?

谢谢!

更新: 我注意到问题实际上是在dll_export中,我在上面没有提到。我正在生成一个DLL并在另一个项目中使用它。如果我删除dllexport并将函数的定义(尽管为空)放在头文件中,它运行正常。但是当我导出我的类并将定义放在cpp文件中时,就是它给我错误的时候。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

删除此行: memset(&amp; m_struct,0,sizeof(m_struct);

它可能会破坏MyStructType中的向量。你为什么这样做?

答案 1 :(得分:0)

由于您说过使用dll_export,因此损坏的原因可能是以下一种或多种:

  • 在代码生成方面,应用程序和DLL没有使用相同的编译器选项进行编译。

  • 应用程序和DLL在运行时使用不同的堆。

对于第一项,您必须确保编译器选项(如结构打包)以及以某种方式更改类内部的任何其他选项都是相同的。但更基本的是,应用程序和DLL必须使用相同版本的编译器进行编译。

对于第二项,您必须确保应用程序和DLL使用相同的堆。为此,DLL和app都必须使用运行时库的DLL版本。

当你有一个处理动态分配内存的类时,如std::vector传递并跨模块边界使用这些类会变得容易出错。请注意,问题不是std::vector,因为任何类,即使是您编写过的类,如果类使用堆,也会遇到相同的问题。