我有一个这样的课程:
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文件中时,就是它给我错误的时候。有什么想法吗?
答案 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
,因为任何类,即使是您编写过的类,如果类使用堆,也会遇到相同的问题。