繁体   English   中英

C ++在堆分配的数据的二进制数组上删除-它会全部删除吗? 关于删除我应该知道些什么?

[英]C++ delete on binary array of heap allocated data - does it delete it all? What should I know about delete?

当我回顾一些我用来处理数据的二进制字符数组的代码时,我脑海中浮现出这个问题。

如果myBinaryDataArray充满二进制数据(包括'\\ 0'字符),以下半伪C ++代码是否可以从堆中准确释放myBinaryDataArray? 我确定某个地方有文档,但是我进行了几次搜索,但没有找到结果-可能是我的措辞。

代码示例:

char* myBinaryDataArray = new char[someLengthMyProgramNeeds];

/* mBinaryDataArray filled with binary data */

delete[] myBinaryDataArray;

我一直使用的假设是delete知道“如何”正确删除,但是最近我从某些方法返回某些对象后遇到了Delete问题(我注意到未调用析构函数)。 我现在开始怀疑我是否正确使用了它。

是否有人对删除及其操作有很好的资源或说明,使用时应记住什么?

同样,只是要确保它不是我。如果有人可以让我知道在返回的分配给对象的堆的指针上调用delete是不正确的,那为什么不呢? 我已经找到了一些可以通过将其类型转换删除为应该为该类型的指针而进行编译的东西,但是我不知道这是否正确。 我想我读了一些东西,但是本质上我想了解有关C ++中删除的更多信息。

#include <iostream>

class foo {
public:
  ~foo() { std::cout << "Destructor called" << std::endl; }
};

class bar {
public:
  foo* myMethod() { return new foo(); }
};

int main(int argc, char** argv)
{
  bar b;
  foo* f = b.myMethod();

  delete f;
}

输出:

Destructor called

回应:

同样,只是要确保它不是我。如果有人可以让我知道在返回的分配给对象的堆的指针上调用delete是不正确的,那为什么不呢? 我已经找到了一些可以通过将其类型转换删除为应该为该类型的指针而进行编译的东西,但是我不知道这是否正确。 我想我读了一些东西,但是本质上我想了解有关C ++中删除的更多信息。

只要指针是完整的,是否从函数调用中返回指针都没有关系。 对象指针的唯一更改应通过支持的强制转换完成。

即使newdelete具有类型感知能力,它们仍然基于分配器,并且依赖于new的原始指针,而new则被传递回delete 在图书库或视频租赁商店中,将“ new和“ delete视为同一计数器。

正确的做法是仅delete最初使用newnew[]分配的对象,或者让智能指针为您处理删除操作。

new通常应放入构造函数中,而delete则应放入相应的析构函数中,但可以在工厂方法中或其他任何地方使用。

使用C ++虚拟析构函数的原因是允许正确删除多态类型。 只要Base和Derived实现正确的虚拟析构函数,所有类管理的资源都将被正确释放。

析构函数将基于类型信息执行,但是析构函数中的任何代码都将在原始对象位于指针地址的假设下进行操作。 分配器使用像伙伴系统这样的算法,该算法依赖于指针的位置,并且簿记信息保存在对象的相对偏移处。 如果您通过delete更改了指针,则它是一个bug,通常会破坏堆。

如果myBinaryDataArray充满二进制数据(包括'\\ 0'字符),以下半伪C ++代码是否可以从堆中准确释放myBinaryDataArray?

否。如果在调用delete[]之前发生异常或其他控制流事件(回想起),它将泄漏。

我一直使用的假设是delete知道“如何”正确删除,但是最近我从某些方法返回某些对象后遇到了Delete问题(我注意到未调用析构函数)。 我现在开始怀疑我是否正确使用了它。

如果您要调用delete[]delete自己,则绝大多数情况是您未正确使用它。 delete[]delete对用户没有用。

是否有人对删除及其操作有很好的资源或说明,使用时应记住什么?

您无需记住任何内容,因为无需使用delete 对于库实现者来说,这是一个有用的原语。 几乎所有有用的高级API都是标准提供的。

即使您有一些引人注目的用例,但在Boost中绝对不可能由vectorunique_ptr / shared_ptr和朋友来解决(这是极不可能的),但仍没有使用delete动机,因为任何值得使用的API都会使用deleter函数,并且标准已经提供了一种delete

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM