如果我在C++中分配一个带有运算符 new[] 的对象数组,但单独释放它们是否仍然构成内存泄漏
If I allocate an a array of objects with operator new[] in C++ but deallocate them individually does it still constitute a memory leak?
我知道不应该将new[]与删除混合和匹配,反之亦然(delete[]与new)。所以
int* k = new int[5];
delete k;
有缺陷,因为它不会释放分配的数组。但以下有错吗?
int *k = new int[5];
for (int i = 0; i < 5; ++i)
delete k[i];
我的意思是错误的 - 它真的会导致内存泄漏或未定义的行为吗?
编辑**我的错,我的意思是这样的:
int** k = new int*[5];
memset(k, 0, sizeof(int*)*5);
k[3] = new int;
for (int i = 0; i < 5; ++i)
if (k[i])
{
delete k[i];
k[i] = 0;
}
在上面,除非我在k
本身上调用 delete[],否则 5 个位置的块实际上永远不会被释放,尽管我可以新建/删除管理其中的整数。
k[i]
是一个int
,所以在语法上调用delete
是无效的。编译器应引发错误。
即使可以,也会导致未定义的行为(假设您有一个指针数组,您可以使用new[]
分配并尝试使用delete
删除它)。将new[]
与delete
混合,将new[]
与delete
混合会产生 UB。
无论哪种方式都不能混合搭配。如果这样做,则存在未定义的行为(§5.3.5/2):
在第一种替代方法(删除对象)中,
delete
的操作数的值可以是空指针值、指向由上一个新表达式创建的非数组对象的指针,或者指向表示此类对象的基类的子对象 (1.8) 的指针(条款 10)。否则,行为未定义。在第二种替代方法(删除数组)中,
delete
的操作数的值可以是空指针值,也可以是由前一个数组 new-expression 产生的指针值。否则,行为未定义。
(粗体强调是我的)
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 释放错误后堆使用
- 用C++在单独的头文件中完成函数体
- G锁定铸造到基础上会释放模拟行为
- 类模板的成员功能的定义在单独的TU中完全专业化
- 在将变量声明为引用时,堆在释放后使用
- 如何使用单独文件中的派生类访问友元函数对象
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- CoInitialize()在单独的线程上崩溃而不返回
- avrogencpp能为模式中的每种类型生成单独的头文件吗
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- 单独定义模板化嵌套类方法的正确语法
- 如何将 2 个类分成单独的 .h 文件并正确设置它们
- C++双重释放或损坏(out)
- C++ 链接到单独的.cpp文件说"multiple definitions"
- 如何在c++中释放内存
- 使用全局声明的向量时,C++双重释放错误/损坏
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 如果我在C++中分配一个带有运算符 new[] 的对象数组,但单独释放它们是否仍然构成内存泄漏