所以我看到它与内存管理功能配对,例如malloc/free
,new/delete
和new[]/delete[]
,但有时你并不总是在调用{{ 1}}或new
,您仍然需要致电new[]
,delete
或delete[]
。例如,strdup就是这样一个函数,它封装了内存的分配,你以后仍然需要自己解除内存。
所以你什么时候知道要释放记忆,如果你在某种意义上并不总是写free
或new
?我对deleting arrays of objects特别好奇。只是简单的数组。因为,这似乎是malloc
的用例之一。 (我正在查看cplusplus。)
那么,这有效吗?这有必要吗?什么遗失了?
delete[]
unsigned char bytes[4] = {0xDE, 0xAD, 0xBE, 0xEF};
for(int i = 0; i < 4; i++)
std::cout << std::hex << +bytes[i];
delete[] bytes;
在技术上属于bytes
类型,对吗?我知道我在技术上有一个指针,但由于这不是一个对象数组,我不确定它是否会被自动销毁。
答案 0 :(得分:3)
C ++何时使用delete []并正确释放内存?
当内存被分配了new[]
的内存并且该内存尚未被释放,并且不会被其他任何人释放。
那么,这有效吗?
无效。你所展示的是未定义的行为。您可能无法释放自动变量。对于未使用delete[]
分配的任何内容,您不得拨打new[]
。
这有必要吗?
没必要。 自动变量会在超出范围时自动销毁。
bytes
从技术上讲是unsigned char *
类型,对吗?我知道我在技术上有一个指针
不对。所有问题都是bytes
,一个阵列。不是指针。
在这方面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
答案 1 :(得分:2)
不,这是无效的。
对delete[]
的每次通话都应与new[]
配对。如果它没有配对(例如strdup
),那是因为某些功能在内部调用malloc
/ new[]
。
unsigned char bytes[4] = {0xDE, 0xAD, 0xBE, 0xEF};
在堆栈上声明4个字节的内存。堆栈内存在封闭scope的末尾自动销毁。它们共享与函数调用所需的内存相同的内存。
new
/ delete
分配和释放堆内存。堆内存没有特定的获取或销毁顺序(与堆栈不同,这是first-in-last-out),因此您必须明确delete
或程序不知道何时解除分配。