首页 > 试题广场 >

如果类的定义如下,则以下代码正确并且是良好编程风

[单选题]
如果类的定义如下,则以下代码正确并且是良好编程风格的是:
class Object
{
  public:
    virtual ~Object() {}
    //…
};

  • std::auto_ptr<Object> pObj(new Object);
  • std::vector<std::auto_ptr<Object*> > object_vector;
  • std::auto_ptr<Object*> pObj(new Object);
  • std::vector<std::auto_ptr<Object> > object_vector;
推荐
答案: A
解释:
1 auto_ptr的意义 
 std::auto_ptr是C++标准库里面的模版类, 属于智能指针
 当系统异常退出的时候避免资源泄漏(内存)。 其他的资源还对应其他的智能指针。  
2 auto_ptr的使用 
std::auto_ptr<int> test(new int(1)); 
test将是一个auto_ptr的对象,使用一个int指针进行初始化。 
test可以象其他指针一样使用,如使用* 使用->但是++不可以使用,以后也许会扩展,其实难对++做越界管理,也许可以放弃一些速度。  
当使用auto_ptr的时候,必须使用显式的类型转化来初始化,如auto_ptr<classA> a(new classA) 
而不能使用auto_ptr<classA> a = new classA;  
3 auto_ptr所有权的转移 
auto_ptr对所有权有严格的约定,一个auto_ptr只能控制一个指针,不能控制多个,当auto_ptr拥有一个指针的时候就不能在拥有其他的指针了。同时,不同的auto_ptr不能拥有同一个指针。
编辑于 2015-10-25 13:32:41 回复(0)
智能指针实质是一个栈对象,而并非指针类型。C++的auto_ptr的作用是动态分配对象以及当对象不再需要时自动执行清理。
使用std::auto_ptr,要#include <memory>。
(1)尽量不要使用“operator=”(如果使用了,请不要再使用先前对象)。

(2)记住release()函数不会释放对象,仅仅归还所有权。

(3)std::auto_ptr最好不要当成参数传递(读者可以自行写代码确定为什么不能)。

(4)auto_ptr存储的指针应该为NULL或者指向动态分配的内存块。

(5)auto_ptr存储的指针应该指向单一物件(是new出来的,而不是new[]出来的)。auto_ptr不能指向数组,因为auto_ptr在析构的时候只是调用delete,而数组应该要调用delete[]。

(6)使用auto_ptr作为成员变量,以避免资源泄漏。
(7)auto_ptr不能共享所有权,即不要让两个auto_ptr指向同一个对象。
(8)auto_ptr不能作为容器对象,STL容器中的元素经常要支持拷贝,赋值等操作,在这过程中auto_ptr会传递所有权,那么source与sink元素之间就不等价了。

参考:http://www.cnblogs.com/qytan36/archive/2010/06/28/1766555.html
http://www.cnblogs.com/Braveliu/p/3290441.html


编辑于 2016-04-06 15:26:24 回复(0)
c++primer(第4版)P519
小心地雷
不能将auto_ptr存储在标准库容器类型中,
发表于 2016-09-18 10:11:32 回复(2)
《c++ primer》(第五版)p419指出:
auto_ptr 包含在标准库的较早版本中,它具有unique_ptr的部分特性,但不是全部。
特别是:我们不能在容器中保存auto_ptr,也不能从函数中返回auto_ptr。
故正确答案只能是A,C中的一个,显然是A
发表于 2016-07-19 17:00:53 回复(0)
auto_ptr已弃用,应当使用unique_ptr。
不能在容器中保存auto_ptr,也不能从函数中返回auto_ptr
发表于 2018-06-07 10:49:52 回复(0)
直接不使用auto_ptr就是了
发表于 2020-10-17 20:14:25 回复(0)

auto_ptr是一个模板类,定义如下:

template <typename Type>
class
 auto_ptr {...};

它存储的是一个指向Type的指针。

顾名思义,auto_ptr是一种智能指针,它包含一个动态分配内存的指针,并在它生命周期结束的时候,销毁包含的指针所指向的内存。
  1. 用法一:    
  2. std::auto_ptr<MyClass>m_example(new MyClass());    
  3.     
  4. 用法二:    
  5. std::auto_ptr<MyClass>m_example;    
  6. m_example.reset(new MyClass());    
  7.     
  8. 用法三(指针的赋值操作):    
  9. std::auto_ptr<MyClass>m_example1(new MyClass());    
  10. std::auto_ptr<MyClass>m_example2(new MyClass());    
  11. m_example2=m_example1;    
发表于 2017-08-26 12:49:46 回复(0)
NJ头像 NJ
智能指针,我们见面了!
发表于 2017-08-08 17:28:32 回复(0)
//vector不是定义在std命名空间中的,如果不添加vector头文件,std::vector这样是错的。
std::auto_ptr<Object> pObj(new Object);//正确
std::vector<std::auto_ptr<Object*> > object_vector;//不太清楚能不能智能指针能不能指向二级指针。
std::auto_ptr<Object*> pObj(new Object);//错误,<A>表示指向类型A的智能指针,不用再用*声明是指针了。
std::vector<std::auto_ptr<Object> > object_vector;//如果添加了vector头文件,正确。
发表于 2016-07-07 10:48:58 回复(0)
这个指针废弃了,能不用就不用
发表于 2023-12-25 21:15:45 回复(0)
含虚函数不是不可以new吗
发表于 2022-04-17 23:05:14 回复(1)
autoptr不能放容器里,sharedptr可以放 autoptr的正确使用方式
发表于 2019-07-13 23:41:56 回复(0)
智能指针
发表于 2019-02-22 08:51:52 回复(0)
补充一点,虚析构所以对象最好new在堆上
发表于 2017-08-26 16:00:00 回复(0)
1)如果使用shared_ptr , 可以使用vector来把指针存到一起
2) auto_ptr就相当于一个指针
3)当——从新复制——作为参数传入——时候,原来的对象会被释放
4)不能使用 auto_ptr<int> aInt = new int();  这种传统的赋值方式,要像A那种
发表于 2017-06-12 19:41:26 回复(0)
D选项,如果头文件中包含#include <vector>时,D选项中把vector前面的std去掉,也正确
发表于 2016-03-18 10:16:24 回复(1)