相关疑难解决方法(0)

208
推荐指数
5
解决办法
5万
查看次数

可能STL迭代器方法抛出异常

析构函数可能不会抛出异常(因此在异常处理期间可以完成堆栈展开),并且必须释放分配给该对象的任何资源(因此不会泄漏资源).包含多个其他对象(或分配了多个资源)的对象的设计可能会在STL容器中记录指向它们的指针.因此析构函数将使用以下与迭代器相关的方法:

  • begin(),end()对于容器
  • operator++ 对于有效的迭代器
  • operator*或者operator->对于有效的迭代器

但是为了保证析构函数不会抛出异常并释放其资源,您需要依赖那些永远不会抛出异常的方法.

依赖那些从不抛出异常的方法是否安全?很难想象一个实际的实现会抛出异常,因为STL迭代器本质上是一个指针.但标准C++是否要求这些方法永远不会抛出异常?我没有在C++标准中找到明确的陈述.


编辑:有趣的情况是C++ 03,当你想拥有一个指向资源的容器.这样做有充分的理由; 例如,如果您有多态资源.正如BjörnPollex在他的回答中指出的那样,如果你使用一个资源容器(比如a std::list< Resource >)而不是一个指向资源的指针的容器,容器的析构函数将为你处理对象的破坏(释放)Resource.

c++ stl exception

18
推荐指数
2
解决办法
5397
查看次数

指针地图与结构/容器地图(C++)

我正在学习数据结构课,在教授的所有例子中,他总是使他的地图具有指向结构或容器的指针值,而不是保持结构或容器本身.

他只是把它作为一种习惯,还是有充分的理由来加速?

  • 我知道你可以使用数据指针来避免拥有冗余的数据副本,但仍然可以同时保存多个容器/结构中的数据.
  • 在这些例子中,情况并非如此.数据仅在该地图中.

c++ dictionary pointers

8
推荐指数
1
解决办法
2295
查看次数

在类中存储指针或对象?

只是一个设计/优化问题.什么时候存储指针或对象?为什么?例如,我相信这两个工作(除了编译错误):

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:我应该存储整个对象,还是指向对象的指针?

谢谢!

c++ pointers class object move-semantics

5
推荐指数
3
解决办法
4614
查看次数

存储动态创建的对象

假设我有一个类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?另外,如果使用第二个选项,我需要清理所有东西吗?

c++ oop pointers

-2
推荐指数
1
解决办法
132
查看次数

标签 统计

c++ ×5

pointers ×3

stl ×2

auto-ptr ×1

c++-faq ×1

class ×1

dictionary ×1

exception ×1

move-semantics ×1

object ×1

oop ×1

raii ×1