删除后动态数组中的 C++ 内存
C++ memory in dynamic array after delete
。下图描述了删除前和删除后的内存。我想知道为什么我仍然看到某种内存地址。我的问题是:它是由编译器引起的还是我在释放内存时做错了什么。
代码片段:
__int16** Matrix{};
size_t width{ 35 };
size_t height{ 4 };
Matrix = new __int16* [height];
for (size_t i = 0; i < height; ++i)
{
Matrix[i] = new __int16[width];
for (size_t j = 0; j < width; ++j)
{
Matrix[i][j] = NULL;
}
};
//DEALLOCATE ALLOCATED MEMORY
for (size_t i = 0; i < height; ++i)
{
delete[] Matrix[i];
}
delete[] Matrix;
释放指针指向的内存既不会导致指针设置为空,也不会导致释放的内存归零。
解除分配仅意味着您告诉(系统)分配器您不再使用该内存并且它可以将其用于其他分配请求。分配器不需要以任何方式修改内存。
取消引用指向您通过调用 delete[]
释放的内存的指针会导致未定义的行为。这并不意味着您会观察到任何特定行为,而是意味着任何事情都可能发生。它可以例如碰巧 delete
对您的程序的内存没有影响,但仍然不允许您继续使用它。
代码片段:
__int16** Matrix{};
size_t width{ 35 };
size_t height{ 4 };
Matrix = new __int16* [height];
for (size_t i = 0; i < height; ++i)
{
Matrix[i] = new __int16[width];
for (size_t j = 0; j < width; ++j)
{
Matrix[i][j] = NULL;
}
};
//DEALLOCATE ALLOCATED MEMORY
for (size_t i = 0; i < height; ++i)
{
delete[] Matrix[i];
}
delete[] Matrix;
释放指针指向的内存既不会导致指针设置为空,也不会导致释放的内存归零。
解除分配仅意味着您告诉(系统)分配器您不再使用该内存并且它可以将其用于其他分配请求。分配器不需要以任何方式修改内存。
取消引用指向您通过调用 delete[]
释放的内存的指针会导致未定义的行为。这并不意味着您会观察到任何特定行为,而是意味着任何事情都可能发生。它可以例如碰巧 delete
对您的程序的内存没有影响,但仍然不允许您继续使用它。