编写没有new和delete关键字的c ++?最好的方法?

时间:2013-02-16 16:53:52

标签: c++ containers

我正在尝试编写c ++代码而不使用关键字newdelete

首先,这是一个好习惯吗?

这样编码的一个副作用是我不能依赖nullptr来表示空值。

例如:

std::array<std::array<fb::Block *, Panel::Y>, Panel::X> blocks;

变为

std::array<std::array<fb::Block, Panel::Y>, Panel::X> blocks;

描述空座的最佳方法是什么?

我虽然使用了这个:

class Block {
  private:
  protected:
  public:
  ...
  static const Block EMPTY;
  };
}

const Block EMPTY(0, BlockType::TUTORIAL, 0, 0);

你们觉得怎么样?这是一个好方法吗?

3 个答案:

答案 0 :(得分:4)

如果您想编写安全代码并简化内存管理,您确实应该避免使用delete。但是没有必要丢弃new。最好的方法是使用new分配您想要的任何对象,并将其存储在std::shared_ptrstd::unique_ptr等智能指针中。您始终可以将这些指针与nullptr进行比较。并且所有对象都将被自动删除。

有些人会建议在此方案中将原始new替换为make_sharedmake_unique来电。

相关问题是何时使用T&以及何时使用T*将参数传递给函数。经验法则是:只要输入参数不存在,就使用T*,使用T&确保提供输入参数。

答案 1 :(得分:1)

C ++是一种旨在实现最高性能的语言,同时提供非常高级的功能(完整的OO,多重继承,通用编程)。 “最高性能”的一部分恰恰是使用显式内存管理(是的,有一些语言,甚至像Boehm collector这样的C ++包,可以减轻你跟踪已分配内存的负担;成本巨大,有时令人望而却步)。 C ++是一个工具,恰好有非常锐边。远离儿童的手。请特别小心使用。

该语言的功能包含在使用的适当时间和地点。

答案 2 :(得分:0)

  

这样的编码的副作用之一是我不能依赖   nullptr表示空值。

你到底在做什么?无论指针指向何处,nullptr都会生成一个很好的空指针。它与newdelete没有任何关系。不new任何东西都不会阻止你使用指针,空或不。

  

首先,这是一个好习惯吗?

newdelete都是非常不安全的,所以从你的代码库中驱逐它们就像它们所带来的传染性瘟疫一样。绝对正确的是,您永远不应该使用deletenew 稍微更复杂,因为某些非常薄的包装器有更多的理由,比如

template<typename T, typename... Args> std::unique_ptr<T> make_unique(Args&&... args) {
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}

然而,绝对是真的,在专门用于分配智能指针的包装器之外,你绝不应该使用非展示位置new,你永远不应该使用deletedelete[]。使用智能指针和容器等RAII类,可以安全地保证程序的正确性。

相关问题