使用 ASSERT " _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) "调整动态分配的内存C++的大小

resize dynamically allocated memory C++ with ASSERT" _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) "

本文关键字:动态分配 调整 nBlockUse C++ 内存 TYPE BLOCK ASSERT IS VALID 使用      更新时间:2023-10-16

我正在写一些代码来调整动态分配的内存大小。这是我代码的一部分初始化:

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::stringstd::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];
}