【发布时间】:2013-11-23 16:57:54
【问题描述】:
今天在我的项目中遇到了内存问题,其中一个类使用了 c++ 11 initializer_list。系统发出内存问题的信号:“dbgdel.cpp 中的表达式 _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)。我将代码简化为一个简单的示例,它不再抛出表达式,但问题在调试输出中变得明显。在我看来,这代码是正确的,它似乎也适用于 g++。
#include <functional>
#include <memory>
#include <string>
#include <iostream>
#include <vector>
#include <map>
#include <sstream>
#include <initializer_list>
using namespace std;
class B {
public:
char data[256];
B(const string& x) {
cout << "Init " << this << endl;
}
B(const B& b) {
cout << "Copy " << this << endl;
}
~B() {
cout << "Deleting b " << this << endl;
}
};
class C {
public:
vector<B> bs;
C(initializer_list<B> bb) {
for(auto& b : bb) {
bs.push_back(b);
}
}
};
int main(int argc, char** argv) {
C bb { B("foo"), B("bar") };
return 0;
}
输出是:
初始化 00B7FAE8 初始化 00B7FBE8 复制 00E108A0 复制 00E10AE8 (?????) 删除 b 00E108A0 复制 00E10BE8 删除 b 00B7FBE8 删除 b 00B7FAE8 删除 b 00B7FAE8(删除两次!)我在这里犯了什么错误或者这不应该工作?
【问题讨论】:
-
C是什么,Bs 有什么作用? -
对不起。我在答案中加入了 C。
-
A与示例相关吗? -
不,这是简化示例的遗留问题。
-
在析构函数中设置断点并比较堆栈跟踪以查看它发生的位置。
标签: c++ visual-c++ c++11 visual-studio-2013 initializer-list