使用指针分配内存

时间:2016-06-13 18:47:22

标签: c++ pointers memory

我是C ++的新手,尝试按照教程系列来学习语言,分配内存的挑战是为26个字符分配内存,然后用字母表填充它们,abcde ......等。

我以为我知道解决方案,但遇到了这个错误: $my_job让我失望的部分是程序完全执行,a-z但仍然会抛出此错误

这是我的代码:

Invalid address specified to RtlValidateHeap( 00490000, 0049D9EC )

如果问题措辞不当,我很抱歉,我是c ++和stackoverflow的新手。

3 个答案:

答案 0 :(得分:5)

当您说delete[] pChar;时,您实际上是在尝试删除pChar当前指向的内容,这与最初分配的位置不同。

简而言之,当您使用new分配内容时,它会放置一些有关分配的数据(例如分配的大小,因此您不需要像C ++是新的那样说delete[26] pChar; )通常在新分配的内存的左侧,它可能会将您编写的内容(字母表)解释为尝试使用它来释放内存时的信息,这当然不会起作用。

您应该将原始指针的副本存储到您已分配的内存中,并使用它来删除,或者可能是更好的选项,使用i并通过指针算法下标索引,如:

char c = 'a';
char *pChar = new char[26];

for (int i = 0; i < 26; i++, c++) {
    pChar[i] = c;
    cout << pChar[i] << flush;
}

delete[] pChar;

答案 1 :(得分:2)

问题是,当控制离开循环时,pChar指向一个超过数组末尾的位置。然后你在那个指针上调用delete[],这就像把一个破坏的球穿过错误的房子。

答案 2 :(得分:1)

正如在其他答案中已经提到的那样,您无法在调用delete[]后更改的指针上调用new []。这是未定义的行为。

delete []需要传递与调用new[]时完全相同的指针值。

这是最简单的解决方法,无需更改pChar

#include <iostream>

int main()
{        
    char c = 'a';
    char *pChar = new char[26];

    for (int i = 0; i < 26; ++i) {
        pChar[i] = c; // access the character by index ...
        std::cout << pChar[i] << std::flush; // access the character by index ...
        // ++pChar; DON'T change the original pointer
        ++c;
    }

    delete[] pChar;
    return 0;
}

Live Demo