C++11 :从当前实例(此)进行unique_ptr的解决方法
C++11 : A workaround for making unique_ptr from current instance (this)
我有一个函数SomeFunc
它接受类型A
的unique_ptr
作为参数。我想从类内部调用SomeFunc
并将当前实例作为参数发送到函数。我使用以下方法,并且出现分段错误。为什么会这样,除了在这里使用原始指针之外,是否有解决方法?
#include <iostream>
#include <memory>
using namespace std;
class A;
extern void SomeFunc(const unique_ptr<A>& Some1);
class A {
public:
A() {}
void Success() { cout << "Heyn"; }
void Func() {
const unique_ptr<A> Some1(this);
SomeFunc(Some1);
}
};
void SomeFunc(const unique_ptr<A>& Some1) { Some1->Success(); }
int main() {
A a;
a.Func();
return 0;
}
当unique_ptr超出范围时,它会尝试调用delete this
。 但是this
不是动态分配的,因此出现了seg故障。
你可以在 SomeFunc 之后立即调用 Some1.release((,在unique_ptr超出范围之前,这是一个有点丑陋的黑客。
如果更改接口是可以接受的,更好的解决方案可能是更改接口以接受const A&
,并将其称为SomeFunc(*this)
。
你可以这样做 - 只有当 API 期望unique_ptr到一个完全抽象的类时,它才能很好地工作。 基本上,您可以创建一个转发到您的实例的派生类......即给定
struct Abstract {
virtual void someFun() = 0;
};
和
T apiFun(unique_ptr<Abstract> ptr);
和你的班级
struct MyImpl : public Abstract {
virtual void someFun() { cout << "Hello world!" << std::endl; }
};
那么你可以有
struct AbstractProxy : public Abstract {
Abstract* other;
AbstractProxy(Abstract* other): other(other) {}
virtual void someFun() { other->someFun(); }
};
--当然,这最终不会真正删除您的类。但是由于您实际上无法阻止在堆栈上创建类(在这种情况下,删除它会导致bad things
(TM( 发生(,因此您可能无论如何都不想这样做。如果你想确保你创建的实例总是被删除,你可能不应该公开构造函数,而是提供一个自由函数,该函数总是在堆上创建类的实例。或者,您的unique_ptr希望能够删除您的课程。
在这种情况下,API 似乎已损坏。 unique_ptr
应该只由相应实例的所有者持有,并且该函数似乎并没有试图声明实例的所有权。
相关文章:
- 通过递归进行因子分解
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 为什么 std::unique 不调用 std::sort?
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 使用libgit2、c++进行pull
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 如何使用模板函数的函数签名进行SFINAE
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 将模板化的类型与C++中的某些类/类型进行比较
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 如何对点云数据进行排序
- 从文本文件中读取时钟时间和事件时间并进行处理
- 对字符串进行位操作
- 是否可以使用winusb同时与多个相同的usb设备进行通信
- 是否可以对零模板参数进行模板专门化
- 对字符串进行排序时,在c++中处理sort()
- 试图对缓存进行跨步测试,但程序并没有结束
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟