遍历指针后删除[]时出现C++错误

C++ error on delete[] after iterating through pointer

本文关键字:C++ 错误 指针 删除 遍历      更新时间:2023-10-16

环境:Windows 7 pro x64,Microsoft Visual Studio 2015 Enterprise,版本14.0.25424.00更新3

int testFunction()
{
    std::string _orig = "[188 80% (1/2)O:152]";
    std::string _orig2 = "[999 99% (1/1)O:999]";
    char *orig = NULL;
    char *orig2 = NULL;
    orig = new char[_orig.length() + 1];
    strcpy(orig, _orig.c_str());
    orig2 = new char[_orig2.length() + 1];
    strcpy(orig2, _orig2.c_str());
    *orig++;
    *orig2++;
    int a = atoi(orig);
    int b = atoi(orig2);
    delete[] orig;
    delete[] orig2;
    return 0;
}

运行上面的代码会因"_CrtIsValidHeapPointer(块)"错误而崩溃。

如果我不迭代(*orig++和*orig2++),那么没有问题。

所以我的问题是,我如何迭代指针,然后当我完成了我需要对它们做的事情时,正确地删除它们?

您没有删除分配的指针!

必须对new返回的原始内存地址调用delete。既然你做了orig++,你就不能把指向的地址delete

迭代可以使用索引来完成,并使用数组订阅来取消引用:

orig[i] = 'a';

这与这样做相同:

*(orig+i) = 'a';

或者,您可以获取指向相同数据的另一个指针,并修改此指针。

char* pOrig = orig;
++pOrig;

你为什么写

*orig++; // why dereferencing?

只有++本身可以进行迭代。

避免使用原始指针。你的代码可以更简单:

std::string orig = "[188 80% (1/2)O:152]";
std::string orig2 = "[999 99% (1/1)O:999]";
int a = atoi(orig.c_str() + 1);
int b = atoi(orig2.c_str() + 1);

您的错误是试图删除移位的指针而不是原始指针。因此,堆管理器会得到错误的分配块信息,这些信息通常放在分配的指针之前,从而导致堆损坏。

我如何迭代指针,然后当我完成了我需要对它们做的事情时,正确地删除它们?

创建指针的副本:

char* orig = new char[size];
char* i = orig;
*i++ = 'a';
delete orig;

一个可能更常见的习惯用法是取消引用一个临时的:

for(int i = 0; i < size - 1; i++)
    orig[i] = 'a';

我很想[使用std::string],但我需要使用atoi(),它在std::string 上不起作用

你错了。atoistd::string配合得很好。只需像使用strcpy一样使用std::string::c_str()即可。绝对没有理由用new来分配内存块。

int testFunction()
{
    std::string _orig = "[188 80% (1/2)O:152]";
    int a = 0;
    for (std::string::iterator it = _orig.begin(); it != _orig.end(); ++it) 
    {
        if (isdigit((char)*it))
            a = (atoi(it._Ptr));
    }
    return 0;
}

我明白了。谢谢所有帮助我得出这个结论的人。事实上,使用std::string是最好的方法。