为什么使用std::auto_ptr<>标准容器是错误的?
析构函数可能不会抛出异常(因此在异常处理期间可以完成堆栈展开),并且必须释放分配给该对象的任何资源(因此不会泄漏资源).包含多个其他对象(或分配了多个资源)的对象的设计可能会在STL容器中记录指向它们的指针.因此析构函数将使用以下与迭代器相关的方法:
begin(),end()对于容器operator++ 对于有效的迭代器operator*或者operator->对于有效的迭代器但是为了保证析构函数不会抛出异常并释放其资源,您需要依赖那些永远不会抛出异常的方法.
依赖那些从不抛出异常的方法是否安全?很难想象一个实际的实现会抛出异常,因为STL迭代器本质上是一个指针.但标准C++是否要求这些方法永远不会抛出异常?我没有在C++标准中找到明确的陈述.
编辑:有趣的情况是C++ 03,当你想拥有一个指向资源的容器.这样做有充分的理由; 例如,如果您有多态资源.正如BjörnPollex在他的回答中指出的那样,如果你使用一个资源容器(比如a std::list< Resource >)而不是一个指向资源的指针的容器,容器的析构函数将为你处理对象的破坏(释放)Resource.
我正在学习数据结构课,在教授的所有例子中,他总是使他的地图具有指向结构或容器的指针值,而不是保持结构或容器本身.
他只是把它作为一种习惯,还是有充分的理由来加速?
只是一个设计/优化问题.什么时候存储指针或对象?为什么?例如,我相信这两个工作(除了编译错误):
class A{
std::unique_ptr<Object> object_ptr;
};
A::A():object_ptr(new Object()){}
class B{
Object object;
};
B::B():object(Object()){}
Run Code Online (Sandbox Code Playgroud)
我相信在堆栈或堆上实例化时会出现一个区别?
例如:
int main(){
std::unique_ptr<A> a_ptr;
std::unique_ptr<B> b_ptr;
a_ptr = new A(); //(*object_ptr) on heap, (*a_ptr) on heap?
b_ptr = new B(); //(*object_ptr) on heap, object on heap?
A a; //a on stack, (*object_ptr) on heap?
B b; //b on stack, object on stack?
}
Run Code Online (Sandbox Code Playgroud)
还sizeof(A)应该< sizeof(B)?我还有其他问题吗?(丹尼尔在评论中提醒我关于他的相关帖子中的继承问题)
因此,由于堆栈分配通常比堆分配快,但A的大小比B小,这些权衡中的哪一个如果没有在有问题的情况下测试性能,即使使用移动语义也无法回答?或者一些拇指规则当使用一个比另一个更有利时?(San Jacinto纠正了我关于堆栈/堆分配更快,而不是堆栈/堆)
我猜想更多的复制构建会导致相同的性能问题,(3个副本将比启动第一个实例的性能大约3倍).但是移动构造可能更有利于尽可能多地使用堆栈???
这是一个相关的问题,但不完全相同. C++ STL:我应该存储整个对象,还是指向对象的指针?
谢谢!
假设我有一个类Obj,并且它们的实例是在运行时创建的,我可以不new这样存储它们吗?
Obj my_obj;
std::vector<Obj> my_vec;
my_vec.push_back(my_obj);
Run Code Online (Sandbox Code Playgroud)
还是我必须使用新的?
std::vector<Obj*> my_vec;
my_vec.push_back(new Obj);
Run Code Online (Sandbox Code Playgroud)
如果我的类中有指针怎么办Obj?另外,如果使用第二个选项,我需要清理所有东西吗?