用于在C++中删除数据的名称约定

Dan*_*usa 5 c++

假设我有一些C++方法返回一个指向对象的指针.头文件中的内容如下所示:

uint8_t* getData(void);
Run Code Online (Sandbox Code Playgroud)

这个人返回一个字节数组,但没有任何内容表明这是一个动态的或静态生成的数据(本地的本地数据或用new创建).

C++中是否有特定的命名约定来区分返回动态分配的内存的方法(因此必须由请求者删除),而只返回对静态定义数据的引用的方法?

这样做的首选方式是什么,还是取决于具体情况?

ybu*_*ill 1

我的约定是:

uint8_t* getData();
Run Code Online (Sandbox Code Playgroud)

是静态分配的,或者至少删除这些数据不是我的责任。但是如果它是一个数组我会写:

pair<uint8_t*,uint8_t*> getData();
Run Code Online (Sandbox Code Playgroud)

或者为此定义一个容器。

auto_ptr<uint8_t> getData();
unique_ptr<uint8_t> getData();
Run Code Online (Sandbox Code Playgroud)

分配单个对象,从现在开始我拥有它。

shared_ptr<uint8_t> getData();
Run Code Online (Sandbox Code Playgroud)

分配具有共享所有权的单个对象。

vector<uint8_t> getData();
Run Code Online (Sandbox Code Playgroud)

分配一个数组,向量拥有内存。

  • @Steve:即使*没有*启用优化,大多数编译器也会执行 RVO (5认同)
  • @larsmans:只有当这确实是一个性能问题时,我才会写这篇文章,原因有三个:1)这是一种优化,我真正的意思是*返回*一个向量2)编译器可以在很多情况下通过复制省略来优化它3)我们正在向带有右值引用的 C++0x 迈进,万岁! (2认同)
  • RVO 属于 '03 标准,是每个主要编译器在启用优化的情况下都会执行的操作,并且可以在大多数有用的情况下完成,甚至无需考虑右值引用。输出参数使代码更加复杂且难以阅读。“正确的代码”首先应该简单明了。即使优化不适用,应用程序的结构也会决定这是否重要。如果确实重要的话,代码很容易更改。 (2认同)