使用 ASSERT " _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) "调整动态分配的内存C++的大小
resize dynamically allocated memory C++ with ASSERT" _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) "
我正在写一些代码来调整动态分配的内存大小。这是我代码的一部分初始化:
int size = 1;
string *rev = new string[size];
调整部分:if (j >= size / 2){
size = size * 2;
string *temp = rev;
rev = new string[size];
memcpy(rev, temp, (size / 2)*sizeof(string));
delete[] temp; // <- here causes the error!
}
当我注释掉"delete[] temp"时,我的代码工作得很好,但存在内存泄漏。那么,我如何处理这个错误信息"断言"。请帮助!谢谢!
,因为有人指出断言是由我的代码的其他部分引起的。以下是完整版本,它只是将给定句子中的单词以相反的顺序打印出来。
void ReverseWords(string &sentence) {
char *str = new char[sentence.size()+1];
int size = 1;
string *rev = new string[size];
int j = 0;
int n = 0;
int m = 0;
for (unsigned int i = 0; i < sentence.size(); i++){
str[n] = sentence.at(i);
n++;
if (str[n-1] == ' '){
str[n-1] = ' ';
if (j >= size / 2){
size = size * 2;
string *temp = rev;
rev = new string[size];
memcpy(rev, temp, (size / 2)*sizeof(string));
delete[] temp;
}
rev[j] = str;
cout << rev[j] << endl;
cout << j << endl;
j++;
memset(str, 0, sentence.size() + 1);
n = 0;
}
}
str[n] = ' ';
rev[j] = str;
int rev_size;
for( rev_size = 0; !rev[rev_size].empty(); rev_size++){
}
rev_size--;
while (rev_size >= 0){
if (rev_size == 0){
cout << rev[rev_size] << endl;
break;
}
cout << rev[rev_size] << " ";
rev_size--;
}
delete[] rev;
delete[] str;
return;
}
编辑:我修复了这个错误,感谢@π α ντα ν和@退休忍者。导致断言的错误是我错误地将memcpy函数用于非pod类型。我已将内存更改为:
for (int m = 0; m < j; m++){
rev[m].assign(temp[m]);
}
现在一切都正常了!谢谢。
失败的原因是您正在使用memcpy
复制std::string
。std::string
不是pod类型,不能安全地按位复制,必须使用赋值操作符或复制构造函数进行复制。
更好的解决方案是使用std::vector<std::string>
或std::deque<std::string>
这样的标准容器来处理大小调整和正确复制。
您还可以使用std::stringstream
来极大地简化您的算法,将单词拆分并将它们存储在容器中,但我假设这是用于赋值的,并且不想完全重写您的函数,因此我将向您展示解决问题所需做的最小操作。
代替:
memcpy(rev, temp, (size / 2)*sizeof(std::string));
使用:
for(int i = 0; i < size / 2; ++i)
{
rev[i] = temp[i];
}
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 在c++中使用动态分配的问题
- 使用递归模板动态分配的多维数组
- 对具有动态分配的内存和析构函数的类对象的引用
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 访问动态分配列表中的元素
- 为什么 std::equal_to会导致动态分配?
- 调用析构函数以释放动态分配的内存
- 动态分配Q_Property变量
- 在 C++ 中搜索动态分配的数组中的出现次数
- 动态分配的聊天数组打印缺失的数据和空
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 使用动态分配将 char* 复制到另一个字符**
- 使用指针在存在特征库的情况下动态分配 c++ 中的矩阵
- 二维阵列的动态分配
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 将动态分配的数组的大小调整为较小的大小C++
- 使用 ASSERT " _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) "调整动态分配的内存C++的大小
- 为类调整动态分配的指针数组的大小