【发布时间】:2014-04-19 19:27:24
【问题描述】:
我有这样的课程:
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 释放内存冲突错误:
void main()
{
Foo f;
f.m_struct.my_vec.push_back(10);
}
但是,如果我按照以下方式进行操作,结果是一样的,但我没有收到任何错误:
int main()
{
Foo f;
f.MyFunc(10);
}
对我来说,这两种方法应该是相同的。鉴于实际代码比上面的 sn-p 更复杂,我更愿意将 m_struct 公开并使用第一个选项。有什么建议可以解释为什么第一种方法在释放向量时会出错?
谢谢!
更新: 我注意到问题实际上出在 dll_export 中,我在上面没有提到。我正在生成一个 dll 并在另一个项目中使用它。如果我删除 dllexport 并将函数的定义(虽然是空的)放在头文件中,它运行正常。但是当我导出我的类并将定义放入 cpp 文件时,它给了我错误。有什么想法吗?
【问题讨论】:
-
您可能在未发布的代码中的某处损坏了内存。
-
通过
Foo::Foo()和Foo::~Foo()的简单实现,我能够毫无问题地运行这两种方法。 -
我只有 std::vector。根本没有指针,我也没有对向量索引做任何奇怪的事情。所以我不确定内存损坏是如何发生的。
-
我刚才添加的构造函数会不会有问题?
-
你到底为什么要在你的 Foo 构造函数中将 m_struct 归零?您刚刚弄乱(阅读:损坏)结构中的整个 std::vector 并撤消了向量构造函数的工作。
标签: c++ class memory vector destructor