迭代指针后,删除[]时出现C ++错误

时间:2016-07-30 16:23:29

标签: c++

环境:Windows 7专业版x64,Microsoft Visual Studio 2015企业版,版本14.0.25424.00更新3

folders = ['X','Y','Z']  
for f in folders:
    a = !ls data/X
    print(a) 

使用" _CrtIsValidHeapPointer(block)"运行上面的代码崩溃错误。

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

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

4 个答案:

答案 0 :(得分:2)

你没有删除你分配的指针!

必须在delete返回的原始内存地址上调用

new。由于您执行了orig++,因此您无法delete指向的地址!

可以使用索引进行迭代,并使用数组预订来取消引用:

orig[i] = 'a';

这与执行此操作相同:

*(orig+i) = 'a';

或者你可以获得另一个指向相同数据的指针,并修改它。

char* pOrig = orig;
++pOrig;

你为什么写

*orig++; // why dereferencing?

只需++就可以进行迭代。

答案 1 :(得分:2)

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

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);

您的错误是您尝试删除移位的指针而不是原始指针。结果堆管理器得到错误的分配块信息通常放在分配的指针之前,并且你有堆损坏。

答案 2 :(得分:0)

  

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

创建指针的副本:

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合作就好了。只需使用std::string::c_str(),就像使用strcpy一样。绝对没有理由使用new分配内存块。

答案 3 :(得分:0)

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实际上是最好的方法。