当auto_ptr未初始化时,get()函数是否可靠?

6

Consider the following code:

std::auto_ptr<std::string> p;

if (p.get() == 0) {
   ...
}

get() 成员函数是一种标准且可靠的方法,用于检查 p 是否已被初始化吗?无论平台、编译器、编译器优化标志等是否存在,它是否总是返回 0?


4
在这个例子中,“auto_ptr”并没有“未初始化”。默认构造函数会将指针初始化为一个空指针,但并不是未初始化的。 - Cody Gray
3个回答

11

不存在未初始化的 std::auto_ptr默认构造函数会将指针初始化为 0

explicit auto_ptr( X* p = 0 );

因此,get() 在默认构造的 std::auto_ptr 上将有效地返回 "0"。


3

这行代码

std::auto_ptr<std::string> p;

调用构造函数

explicit auto_ptr (X* p=0) throw();

该函数将内部指针初始化为0。

因此,"未初始化"的含义取决于您的理解。正如您所展示的那样,调用默认构造函数将产生一个返回0的get。同时,将其初始化为其他值,然后调用reset(0),也会产生返回0的get


在处理多个平台时,我能否依赖于默认构造函数(而无需检查每个实现),或者是否应明确调用reset(0)以确保? - Marc
1
不需要在默认构造函数之后显式调用“reset”。 - Ami Tavory

1
< p > auto_ptrget 方法没有前提条件。

这意味着,无论 auto_ptr 对象处于什么状态,调用该方法始终是安全的。

与此相反,operator* 成员函数具有 get() != 0 的前提条件。C++标准在 Requires 子句中为成员函数指定前提条件。如果没有此类子句,则始终可以安全地调用该函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接