- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我基本上是这样设置的:
class B { /* ... */};
class C1 : public B { /* ... */};
class C2 : public B { /* ... */};
class X
{
std::vector<shared_ptr<B>> m_vec;
void addToVector(B* b);
}
addToVector
无法知道有多少类派生自 B 并且不应该关心。它将被这样调用:
someFunction() {
C1 tmp;
/* do something with tmp */
m_myX.addToVector(&tmp);
}
所以在 someFunction
的末尾,tmp 超出范围并将被删除。 addToVector
必须将 shared_ptr push_back 到 vector 中的 tmp 拷贝,但它如何做到这一点?
void X::addToVector(B* b)
{
int i = sizeof(b); // allways sizeof(B) :(
shared_ptr<B> np(b);
m_vec.push_back(np); // garbage collected after calling fn returns :(
}
它应该做的是:
我该怎么做?
最佳答案
您正在堆栈上创建一个对象,然后将其地址提供给 shared_ptr
,它将尝试删除
堆栈上的一个对象,这是未定义的行为。
解决方案是停止这样做:
void someFunction() {
C1* c = new C1;
/* do something with *c */
m_myX.addToVector(c);
}
现在堆上有一个对象,它可以由 shared_ptr
拥有。无需复制它。
这只有在 B
有一个虚拟析构函数时才能正常工作,但是可以通过首先创建一个 shared_ptr 来避免这种情况(并且代码可以变得更安全和更清晰):
void someFunction() {
auto c = std::make_shared<C1>();
/* do something with *c */
m_myX.addToVector(c);
}
void X::addToVector(std::shared_ptr<B> b)
{
m_vec.push_back(np);
}
现在堆对象一创建就由 shared_ptr
管理,然后安全地存储在 vector 中。
关于c++ - 我如何正确地将 shared_pointers 添加到可能的派生类到 std::vector 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30478182/
因此,我正在尝试加深对 shared_ptr 的理解,如果多个共享 ptr 指向同一资源共享指针,则可以处理在销毁指向资源的最后一个指针之前不应调用 destrcutor 的情况。 这是我的示例代码:
有一段代码: A.cpp class MySomeClass: public SomeClass { public: void specificMethod(); } class A {
我有一个基本多态类(带有虚方法)和一个派生类。我正在尝试使用以下代码 boost::shared_ptr ptr( new derived_class() ); 但是编译器返回如下错误
我有一个派生自 std::enable_shared_from_this 的类。所有类对象都由共享指针管理,因此当没有更多共享指针指向它们时,它们会自动销毁。 我有一个类方法,它从程序的数据结构中删除
我有一个由 Node 和 Edge 类表示的有向图模型。每个 Node 对象都包含指向其所有传出和传入边的指针,每个 Edge 对象都包含指向其起点和终点(Node 对象)的指针。 class Mod
我正在尝试将派生类作为 std::shared_pointer 传递给一个函数,该函数的参数是具有模板的基类。 这是一个完整的例子: template class Base { public:
我使用 reset() 作为我的 shared_pointer 的默认值(相当于 NULL)。 但是如何检查 shared_pointer 是否为 NULL? 这会返回正确的值吗? boost::sh
我正在使用一个程序,其中我的代码调用第三方库,该库使用 boost 和 shared_pointers 来创建一个大而复杂的结构。这个结构是在我调用的方法中创建的,在方法结束时我知道程序已经完成。 对
我有一个函数返回类型为 const A 的共享指针。 std::shared_ptr getPointer() const; 我有一个函数需要 A 类型的 shared_ptr。 void foo(s
我正在尝试使用 tr1 的 shared_ptr 和 Qt 4.8.2 但我遇到了一些麻烦。这是我的代码: #include "mainwindow.h" #include "ui_mainwindo
我一直在尝试从 map 中填充 vector 。我知道如何以更传统的方式做到这一点,但我试图用 STL 算法(一个衬里)来实现它作为某种训练:)。 原始 map 类型是: std::map > 目标
我有以下问题,我想知道是否有更好的方法来解决它: class myObj { public: typedef std::shared_ptr handle; typedef std::
我基本上是这样设置的: class B { /* ... */}; class C1 : public B { /* ... */}; class C2 : public B { /* ... */}
我是一名优秀的程序员,十分优秀!