C++何时使用 delete[] 并正确释放内存?
C++ when to use delete[] and properly deallocate memory?
所以我看到有内存管理函数的配对,如malloc/free
、new/delete
和new[]/delete[]
,但有时你并不总是调用new
或new[]
,你仍然必须调用delete
、delete[]
或free
。例如,strdup 就是这样一个函数,它封装了内存的分配,你以后仍然需要自己释放该内存。
那么,如果你并不总是在写new
或malloc
,你什么时候知道释放内存?我对删除对象数组特别好奇。只是简单的数组。因为,这似乎是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
它,否则程序将不知道何时解除分配它。
- 如何在c++中释放内存
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- std::unordered_map析构函数不释放内存?
- 在C++中释放内存期间,迭代器与指针有何不同
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 释放内存(主题模板)时出现问题
- 使用后自动释放内存
- C++ 如何释放内存
- 从函数内对象的向量中释放内存
- C++ 在不释放内存的情况下调用析构函数
- 多个线程之间的获取-释放内存顺序
- C++ - 析构函数只是释放内存还是实际删除对象
- 使用 RAII 替换最终块以释放内存
- 如何通过带有指向基类的指针的删除运算符释放内存
- 代码中的"sprintf"用法是否需要释放内存?
- C++何时使用 delete[] 并正确释放内存?
- 为什么此获取和释放内存围栏不能给出一致的值?
- 抛出新表达式的参数子表达式时释放内存
- 在这种情况下,如何释放内存?
- 在 c++ 中应按什么顺序释放内存?