1

我正在尝试在不使用关键字newand的情况下编写 c++ 代码delete

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

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

例如:

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

变成

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

描述空 Block 的最佳方式是什么?

我虽然关于使用这个:

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

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

你们有什么感想 ?这是一个好方法吗?

4

3 回答 3

4

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

在这种情况下,有些人会建议将 raw 替换newmake_sharedandmake_unique调用。

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

于 2013-02-16T17:03:22.367 回答
1

C++ 是一种为实现最高性能而设计的语言,同时提供了非常高级的特性(完整的 OO、多重继承、泛型编程)。“最大性能”的一部分正是使用显式内存管理(是的,有一些语言,甚至像Boehm 收集器这样的 C++ 包,可以减轻您跟踪分配内存的负担;成本巨大,有时甚至令人望而却步) . C++ 是一个工具,它恰好有非常锋利的边缘。远离儿童的手。使用时要格外小心。

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

于 2013-02-16T17:13:31.063 回答
0

像这样编码的副作用之一是我不能依赖 nullptr 来获取空值。

你到底在说什么?nullptr制作一个很好的空指针,无论该指针应该指向哪里。new它与和没有任何关系delete。Not newing 不会阻止您使用指针,无论是否为空。

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

两者newdelete非常不安全,因此将它们从你的代码库中驱除是非常好的,就像它们是传染性的错误瘟疫一样。绝对不应该使用delete. new稍微复杂一些,因为一些非常薄的包装有更多的理由,比如

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

但是,绝对正确的是,在专门用于分配智能指针的包装器之外,您永远不应该使用 non-placement new,也不应该使用deleteor delete[]。使用 RAII 类,如智能指针和容器,可以安全地保证程序的正确性。

于 2013-02-16T16:58:43.237 回答