我正在尝试编写c ++代码而不使用关键字new
和delete
。
首先,这是一个好习惯吗?
这样编码的一个副作用是我不能依赖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);
你们觉得怎么样?这是一个好方法吗?
答案 0 :(得分:4)
如果您想编写安全代码并简化内存管理,您确实应该避免使用delete
。但是没有必要丢弃new
。最好的方法是使用new
分配您想要的任何对象,并将其存储在std::shared_ptr
或std::unique_ptr
等智能指针中。您始终可以将这些指针与nullptr
进行比较。并且所有对象都将被自动删除。
有些人会建议在此方案中将原始new
替换为make_shared
和make_unique
来电。
相关问题是何时使用T&
以及何时使用T*
将参数传递给函数。经验法则是:只要输入参数不存在,就使用T*
,使用T&
确保提供输入参数。
答案 1 :(得分:1)
C ++是一种旨在实现最高性能的语言,同时提供非常高级的功能(完整的OO,多重继承,通用编程)。 “最高性能”的一部分恰恰是使用显式内存管理(是的,有一些语言,甚至像Boehm collector这样的C ++包,可以减轻你跟踪已分配内存的负担;成本巨大,有时令人望而却步)。 C ++是一个工具,恰好有非常锐边。远离儿童的手。请特别小心使用。
该语言的功能包含在使用的适当时间和地点。
答案 2 :(得分:0)
这样的编码的副作用之一是我不能依赖 nullptr表示空值。
你到底在做什么?无论指针指向何处,nullptr
都会生成一个很好的空指针。它与new
和delete
没有任何关系。不new
任何东西都不会阻止你使用指针,空或不。
首先,这是一个好习惯吗?
new
和delete
都是非常不安全的,所以从你的代码库中驱逐它们就像它们所带来的传染性瘟疫一样。绝对正确的是,您永远不应该使用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)...));
}
然而,绝对是真的,在专门用于分配智能指针的包装器之外,你绝不应该使用非展示位置new
,你永远不应该使用delete
或delete[]
。使用智能指针和容器等RAII类,可以安全地保证程序的正确性。