【问题标题】:How to handle manual memory management when reassigning a pointer?重新分配指针时如何处理手动内存管理?
【发布时间】:2017-04-03 20:29:46
【问题描述】:

假设我做了这样的事情:

int* arr = new int[30];
int* newArr = new int[30];
arr[15] = 5;
newArr[15] = 9;
arr = newArr;
delete[] newArr;

最后一行将释放 newArr,从而也释放 arr。但是包含 5 的内存块发生了什么?现在是永远无法再次访问的内存泄漏吗?如果是这样,我应该如何确保这个内存永远不会泄漏,同时成功地重新分配原始数组?

【问题讨论】:

  • “从而也释放 arr” 嗯??
  • @πάνταῥεῖ arr 和 newArr 指向同一个东西,所以我说我用delete[] newArr 释放它们是不是错了?
  • 释放两个相同的东西?这是什么意思?
  • 第一个分配的内存丢失了。
  • 它们指向不同的位置。

标签: c++ arrays pointers memory-leaks


【解决方案1】:
int* arr = new int[30];
int* newArr = new int[30];
arr[15] = 5;
newArr[15] = 9;
arr = newArr;
delete[] newArr;

最后一行将释放 newArr,从而也释放 arr。

不完全是。 newArrarr 只是指向内存块的名称。您并没有真正“释放 newArr”,而是释放了它当前指向的内存块。在那一刻恰好是 arr 当前指向的同一块。

但是包含 5 的内存块发生了什么?

它仍被标记为已使用,但您的程序中的任何内容都无法再次指向它。您唯一需要的指针是 arr,但您随后将 arr 分配给了其他东西。

现在是内存泄漏,再也无法访问了吗?

没错。

如果是这样,我应该如何确保这段记忆永远不会 被泄露,同时成功地重新分配了 原始数组?

忘记所有这些动态数组的废话并使用std::vector

std::vector<int> arr(30);
std::vector<int> newArr(30);
arr[15] = 5;
newArr[15] = 9;
arr = newArr;

【讨论】:

  • "忘记所有这些动态数组废话并使用std::vector" 有趣的是你提到这一点,因为我实际上在尝试用 C++ 实现一个向量类进行练习时遇到了这个问题,它违背了在您自己的向量实现中使用 std::vector 的目的。使用指针是因为向量实现中的底层数组需要在某些时候调整大小,但我不太确定如何在不造成内存泄漏的情况下做到这一点......
  • @CoffeeMaker: std::vector 的实现不使用new[],而是使用placement new(这允许它以一种智能的方式提前预留内存)。并不是说这对您有很大帮助。您必须学习如何实现赋值运算符,以便释放旧内存。提示:在析构函数中释放内存,查找“三规则”并使用“复制和交换”习语实现赋值。
【解决方案2】:

最后一行将释放newArr,从而也释放arr

使用free(p),您不会释放p,而是释放p 指向的内存块


使用arr = newArr,您基本上“丢失了跟踪”最初由arr 指向的动态分配的内存块,这意味着您不能再在稍后执行程序时释放它,因此内存泄漏变得不可避免。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 2023-03-19
    • 2013-12-23
    相关资源
    最近更新 更多