gpt4 book ai didi

一个简短的例子没有分配被释放的c++指针

转载 作者:太空狗 更新时间:2023-10-29 23:02:38 24 4
gpt4 key购买 nike

#include<iostream>

class base{
public:
base(){};
base ( base& b ) {};
virtual void run(){};
~base(){std::cout<<"destructor for base"<<std::endl;};
};

class derived : public base {
int alpha;
public:
derived ( ): alpha (0), base() {};
derived ( base& b ) : alpha(0), base(b) {};
void run(){};
int* get_address () { return &(this->alpha); };
~derived(){std::cout<<"destructor for derived"<<std::endl;};
};

void make_derived ( std::shared_ptr<base>& b ){
b.reset ( new derived () );
}

int main(){
std::shared_ptr<base> b;
make_derived ( b ) ;
std::shared_ptr<derived> d = std::dynamic_pointer_cast<derived> (b);

std::shared_ptr<int> a ( d->get_address() );

b->run();
}

我编译并运行了这段代码。错误消息是“未分配正在释放的指针”。这是一个非常常见的错误消息。但是,我不明白为什么会出现任何释放的东西。它在 std::shared_ptr<int> a ( d->get_address() ); 之后立即死亡.有人知道如何解决这个问题吗?

最佳答案

不要删除您没有新建的内容。当您将指针传递给 shared_ptr 构造函数或 reset 函数时,您将在该指针上设置对 delete 的延迟调用(假设您不' 也传递自定义删除器)。这就是这里发生的事情:

std::shared_ptr<int> a ( d->get_address() );

您正在将 int 的地址传递给 shared_ptr 构造函数。但是 int 没有分配给 new,因此不应该由 shared_ptr 处理。

关于一个简短的例子没有分配被释放的c++指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27789900/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com