代码之家  ›  专栏  ›  技术社区  ›  hookenz

是否需要对char数组调用delete[]和delete?

c++
  •  6
  • hookenz  · 技术社区  · 14 年前

    我正在利用一个学院的图书馆发现 valgrind 正在吐出与 delete .

    问题是有像这样的字符数组分配

    char* s = new char[n];
    

    稍后跟进 delete s

    而不是 delete[] s

    他告诉我区别在于 删除[] 将在中的每个位置为对象调用析构函数 s (如果它有一个),在本例中它不是因为它是一个原始类型。我相信那是真的。

    因此,delete s并不是真正的bug, 瓦尔格林德 只是非常彻底。

    它是否仍然可以完全释放所有与 S ?

    3 回复  |  直到 9 年前
        1
  •  22
  •   seaotternerd    9 年前

    如果使用 new[] ,你必须用 delete[] . 一般来说,功能 operator delete(void*) operator delete[](void*) 不一定是一样的。

    参考 here

        2
  •  8
  •   AnT stands with Russia    14 年前

    忘记析构函数。两者之间的区别 new/delete new[]/delete[] 这是两种完全不相关、独立的内存分配机制。它们不能混合。使用 delete 解除分配内存 new[] 与使用没有区别 free 为了同样的目的。

        3
  •  8
  •   Chubsdad    14 年前

    标准没有说明内存将如何被删除——它只是说,不匹配正确的新内容和正确的删除是未定义的行为。

    事实上, new[] 然后 delete 通常释放分配的所有内存 新[ ] ,但该数组中的项的析构函数调用不正确。(大多数时候——不是标准规定的那样)

    您应该考虑使用 vector .