【发布时间】:2014-07-22 16:19:47
【问题描述】:
我不确定我是否理解下面的错误是什么
const char* packs[] = {"zero","one","two","three","four",..."twelve"} //abbreviated for post
struct packinfo {
char* data;
int len;
};
std::vector<packinfo> k;
k.reserve(10000);
for (int i = 0; i < 10; ++i) {
const char* data = packs[i];
packinfo tobuf;
tobuf.data = new char[strlen(data)];
tobuf.len = strlen(data);
memcpy(tobuf.data, data, strlen(data));
k.push_back(tobuf);
}
for (int i = 0; i < k.size(); ++i)
std::cout << "k[" << i << "]: " << k[i].data << ", ";
std::cout << std::endl;
for (int i = 0; i < k.size(); ++i) {
packinfo& pack = k[i];
bool foo = (i < 5);
if (foo) std::cout << "inspecting k[" << i << "]: " << k[i].data << std::endl;
delete pack.data;
if (!foo) {
k.erase(k.begin(), k.begin() + i);
packinfo tobuf;
const char* data = packs[10];
tobuf.data = new char[strlen(data)];
tobuf.len = strlen(data);
memcpy(tobuf.data, data, strlen(data));
break; //intentionally forgot to push_back
}
}
for (int i = 0; i < k.size(); ++i)
std::cout << "k[" << i << "]: " << k[i].data << ", ";
std::cout << std::endl
;
上面运行的输出如下:
k[0]: zero, k[1]: one, ... , k[9]: nine, //all as expected
inspecting k[0]: zero
inspecting k[1]: one
...
inspecting k[4]: four
k[0]: ten^], k[1]: six, k[2] seven, k[3]: eight, k[4]L nine, //gargabe crept in
垃圾是如何爬到向量的开头的?
【问题讨论】:
-
听说过
std::string吗?立即摆脱 char* 的东西,您的所有问题很可能都会得到解决。 -
创建自己的字符串类型是一种学习练习吗?永远记住你是否有一个以 0 结尾的字符串或一个计数字符串(可能同时是两个),并且不要忘记终止符分别不要使用 cstring-functions。
-
整个字符串部分无关紧要,我实际上只是想找出一个更大的问题,其中 std::string 或 strlen 不存在,但我试图将逻辑归结为仍然存在的东西分配和 memcopies 看看我是否能找出问题..strlen 固定为 (strlen + 1) 仍然将 10 放在向量的头部,我不明白这是怎么发生的
-
由于您使用
new[]为packinfo.data分配内存,因此您必须使用delete[]释放内存(注意方括号)。嘿,您知道std::string可以让您免于所有这些容易出错的手动资源管理吗?
标签: c++ memory-leaks stdvector