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

时间:2017-06-05 13:53:13

标签: c++ memory-management c++98

所以我看到它与内存管理功能配对,例如malloc/freenew/deletenew[]/delete[],但有时你并不总是在调用{{ 1}}或new,您仍然需要致电new[]deletedelete[]。例如,strdup就是这样一个函数,它封装了内存的分配,你以后仍然需要自己解除内存。

所以你什么时候知道要释放记忆,如果你在某种意义上并不总是写freenew?我对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类型,对吗?我知道我在技术上有一个指针,但由于这不是一个对象数组,我不确定它是否会被自动销毁。

2 个答案:

答案 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或程序不知道何时解除分配。