堆内存损坏

Man*_*nta -2 c++ windows heap memory-management

int main()
{
    char *p = new char[100];
    strcpy(p, "Test");
    cout << "Before heap corruption: " << p << endl;
    p[150] = '\0';

    cout << "after heap corruption: " << p;

    delete p;

    getchar();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在上面提到的代码中,我在一个不是我的内存位置写'\ 0',即使这样也没有抛出异常.如果使用注释delete p运行上面的代码,则不会抛出任何异常.但是如果它被取消注释,则抛出附加的异常.因此,删除可验证内存所有权.那么,我是否可以知道eaxctly删除是如何工作的以及为什么在写出内存块时有很多验证

在此输入图像描述

Mik*_*our 6

这是未定义的行为.如果您不应该访问内存,那么任何事情都可能发生.没有必要验证你没有这样做; 你应该编写你的程序,而不是编写程序.

如果您想要运行时验证,则需要更高级别的抽象而不是原始数组和指针:

std::vector<char> p(100);
p.at(150) = 0;              // out of bounds, throws exception
Run Code Online (Sandbox Code Playgroud)