说我做这样的事情:如何在重新分配指针时处理手动内存管理?
int* arr = new int[30];
int* newArr = new int[30];
arr[15] = 5;
newArr[15] = 9;
arr = newArr;
delete[] newArr;
最后一行将释放newArr,从而也释放改编。但是包含5的内存块发生了什么?它现在是一个永远不能再次访问的内存泄漏?如果是这样,我应该如何确保这个内存永远不会泄漏,同时成功地重新分配原始数组?
说我做这样的事情:如何在重新分配指针时处理手动内存管理?
int* arr = new int[30];
int* newArr = new int[30];
arr[15] = 5;
newArr[15] = 9;
arr = newArr;
delete[] newArr;
最后一行将释放newArr,从而也释放改编。但是包含5的内存块发生了什么?它现在是一个永远不能再次访问的内存泄漏?如果是这样,我应该如何确保这个内存永远不会泄漏,同时成功地重新分配原始数组?
最后一行将释放
newArr
,从而也释放arr
随着free(p)
,你是不是释放p
但内存块通过p
指出。
随着arr = newArr
,你基本上是“失去了踪迹”最初由arr
指向的动态分配的内存块,这意味着你不能再释放它在以后的某个程序的执行,因此内存泄漏不可避免。
int* arr = new int[30]; int* newArr = new int[30]; arr[15] = 5; newArr[15] = 9; arr = newArr; delete[] newArr;
最后一行将释放newArr,从而也释放改编。
不太。 newArr
和arr
只是指向内存块的名称。你不会真的“释放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''s实现不使用'new []',而是使用新的位置(它允许它以一种智能的方式预先保留内存)。这并不是说这对你有很大的帮助。你必须学习如何实现你的赋值操作符,以便释放旧的内存。提示:在你的析构函数释放内存,查找“规则三”,并实现与“复制和交换”的成语任务。 –
_“从而也释放arr”_咦? –
@πάνταῥεῖarr和newArr指向相同的东西,所以我错误地说我用'delete [] newArr'释放他们两个? –
解放这两个相同的东西?那是什么意思? – juanchopanza