C++何时使用 delete[] 并正确释放内存?

C++ when to use delete[] and properly deallocate memory?

本文关键字:释放 内存 何时使 delete C++      更新时间:2023-10-16

所以我看到有内存管理函数的配对,如malloc/freenew/deletenew[]/delete[],但有时你并不总是调用newnew[],你仍然必须调用deletedelete[]free。例如,strdup 就是这样一个函数,它封装了内存的分配,你以后仍然需要自己释放该内存。

那么,如果你并不总是在写newmalloc,你什么时候知道释放内存?我对删除对象数组特别好奇。只是简单的数组。因为,这似乎是delete[]的用例之一。(我正在看cplus。

那么,这有效吗?这有必要吗?有什么遗漏吗?

unsigned char bytes[4] = {0xDE, 0xAD, 0xBE, 0xEF};
for(int i = 0; i < 4; i++) 
std::cout << std::hex << +bytes[i];
delete[] bytes;

从技术上讲,bytes是一种unsigned char *类型,对吧?我知道我在技术上有一个指针,但由于这不是一个对象数组,我不确定它是否会被自动销毁。

C++何时使用 delete[] 并正确释放内存?

当内存分配了具有new[]的内存并且该内存尚未解除分配时,其他任何人都不会释放该内存。

那么,这有效吗?

无效。您展示的内容具有未定义的行为。您不能释放自动变量。您不得就未分配的任何内容delete[]new[]调用。

这有必要吗?

没必要。自动变量被销毁...自动,当它们超出范围时。

从技术上讲,bytes是一种unsigned char *类型,对吧?

我知道我在技术上有一个指针

不对。bytes在所有方面都是一个数组。不是指针。

那么C++在指向数组的指针方面与 C 有什么不同吗?

没有什么不同。数组也是 C 中的数组。

您可能会对数组衰减感到困惑。在值上下文中使用时,数组名称将衰减为指向第一个元素的指针。数组衰减成的指针是指针,但数组不是。例:

int  arr[4] = {1, 2, 3, 4}; // an array
int* ptr  = arr;            // a pointer; arr decays and is assignable to a pointer
int* ptr2 = &arr[0]         // decaying is syntactic sugar for this
int size1 = sizeof arr;     // size of the array == sizeof(int)*4
int size2 = sizeof ptr;     // size of the pointer == sizeof(int*)

此外,在函数参数列表中,数组声明与指针声明相同。这是非常令人困惑的。你只需要记住数组不能按值传递,所以数组作为函数参数必须意味着别的东西。

void foo(int[4]); // confusing
void foo(int*);   // actually means this

不,这是无效的。

delete[]的每个调用都应与new[]配对。 如果它没有配对(例如strdup),这是因为某些函数在内部调用malloc/new[]

unsigned char bytes[4] = {0xDE, 0xAD, 0xBE, 0xEF};堆栈上声明 4 个字节的内存。 堆栈内存在封闭作用域结束时自动销毁。 它们与函数调用所需的内存共享相同的内存。

new/delete分配和解分配内存。 堆内存没有特定的获取或销毁顺序(与堆栈不同,堆栈是先进后出的),因此您必须显式delete它,否则程序将不知道何时解除分配它。