gpt4 book ai didi

c++ - 交换指针后删除动态分配的内存

转载 作者:行者123 更新时间:2023-12-04 03:24:32 25 4
gpt4 key购买 nike

我对 C++ 比较陌生,我想同时了解内存管理和指针。
假设我有下面的代码

int* p1;
int* p2;
int* p3 = new int[some size];

p1 = p3;

std::swap(p1,p2);
如何正确删除动态分配的内存?做 delete[] p3 就够了吗?之后我也应该删除 p2 吗?

最佳答案

当你做这样的事情时,口语中会有一些模糊:

delete x;
我们说“我们删除 x”。严格来说那是错误的,因为删除的是 x 指向的对象。
通过 new/ new[] 分配的每个对象都必须通过对 delete/ delete[] 的一次调用销毁。无论您有两个或多个指向同一对象的指针都不会改变这一点。
int* p1 = nullptr;
int* p2 = nullptr;
int* p3 = new int[some size]; // p3 points to the array

p1 = p3; // p1 points to the same array

std::swap(p1,p2); // now p1 == nullptr, p2 points to the array
请注意,您的示例中的指针未初始化。读取它们的值会导致未定义的行为。由于这不是问题的关键,我通过初始化它们来避免这一点。
通过 new [] 创建了一个数组,并且您必须通过 delete [] 删除该数组。您不能将其删除两次。所以要么调用 delete[] p3; 要么调用 delete[] p2; ,但不能同时调用。
PS:评论已经提到了智能指针,我也建议你阅读它们。现在你不应该使用原始的拥有指针。拥有指针是您需要调用 delete 的指针,它“拥有”指向的对象。原始指针应该只用于“观察”,即您永远不必担心在原始指针上调用 delete (或 delete[] )。当然,您仍然需要注意所指向的对象是否还活着,但这不是动态分配所特有的:
 int* p;
{
int x = 42;
p = &x; // p points to x;
} // x goes out of scope
// here p is not a valid pointer anymore

关于c++ - 交换指针后删除动态分配的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67862810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com