在构造动态对象时解引用
dereferencing when constructing dynamic object
为什么不使用以下语句:
struct Foo
{
int x;
};
int main()
{
Foo &foo = *new Foo();
foo.x = 7;
std::cout << foo.x << std::endl;
delete &foo;
}
毕竟,必须在可能的情况下使用引用,并且使用这种方法,一旦初始解引用,就不必担心再次忘记它。缺点是什么?编辑:我知道operator ->
,我说的忘记是指
int &n = *new int;
n = 7;
int *m = new int;
*m = 7; //here you can forget it
您将有内存泄漏。您必须在函数末尾做这样的操作:
delete &foo;
可以与智能指针结合使用。
std::unique_ptr<Foo> p(new Foo);
Foo &foo = *p;
//...
然后,内存将在作用域结束时为您正确删除。
这种方法没有明显的缺点。但是,如果必须使用动态分配的引用,即T& t = *new T;
,则应该重新考虑设计。
为什么?因为,
"引用必须在声明时初始化。"
这意味着,你不能做T& t;
,然后分配一些内存给它。
下面的语句:
T& t = *new T; // (1) costly heap allocation (2) exception handling (3) need cleaning
成为了
的低级替代品T t; // (1) cheaper auto allocation (2) no exception (2) no need to clean
所以即使你可以动态分配引用,它们也几乎不需要。
回复:"必须尽可能使用引用"?这个(坏)建议是从哪里来的?
Foo foo;
foo.x = 7;
std::cout << foo.x << std::endl;
没有指针,没有引用,没有自由存储,没有delete
。
但是当你从自由存储区分配时,你会得到一个指向数据对象的指针。不要把它变成引用,除非你绝对有必要,即使这样,也不要这样做。
相关文章:
- 引用对象成员函数的成员函数
- 从 Base 引用对象调用派生类的成员
- 转换引用对象的边界框?
- 现代编译器会优化只引用对象子集的局部变量吗
- l值引用对象上的Constexpr成员函数:Clang和gcc不同意
- 将 const 类型引用对象注册为类成员对象C++
- Boost Intervocess:通过迭代通过从结构引用对象的映射进行迭代时
- 无法用2D矢量成员引用对象
- 在由引用对象传递中访问由引用对象传递的变量
- 如何使用QString引用对象名称
- 使用自动迭代器引用对象
- C++ 在另一个对象中引用对象的当前状态
- 使用共享对象和引用对象进行引用计数
- 未显式引用对象的全局对象构造函数在最终二进制文件 - LD 中被丢弃
- 引用对象的动态类型何时可以更改
- 引用对象内部的指针
- C++从全局静态函数中引用对象
- C++如何仅在没有其他人直接或间接引用对象指针时删除该指针
- 如何使用C++引用对象
- 为什么引用对象仅保存特定类型的引用