问题描述
给出类似这样的功能:
void process() {
std::shared_ptr<Receiver> receiver(std::make_shared<Receiver>());
Command *cmd1 = new InfoCMD(receiver,10);
cmd->Execute();
delete cmd;
DELAY_MS(1000);
Command *cmd2 = new InfoCMD(ble,20);
cmd2->Execute();
DELAY_MS(1000);
delete cmd2;
}
像这样成为BLECommand的基类:
class Command {
protected:
std::shared_ptr<Receiver> pReceiver_;
public:
Command(std::shared_ptr<Receiver> receiver) : pReceiver_(receiver) {}
virtual ~Command() {}
virtual void Execute() const = 0;
};
由于双重删除BLEReceiver objetct(ble)而出现错误,我不知道,因为发生这种情况。 shared_ptr类应避免这种情况。
要调试此问题,我已在BLEReceiver类的析构函数中放置了打印内容,这是设备控制台上的输出:
W (9932) Receiver: delete receiver
W (10872) Receiver: delete receiver
CORRUPT HEAP: multi_heap.c:172 detected at 0x3ffbddcc
abort() was called at PC 0x4008d873 on core 0
Setting breakpoint at 0x40089a0a and returning...
有解决这个问题的主意吗?预先感谢。
编辑:
基类的声明是这样的:
class InfoCMD : public Command {
private:
uint32_t info;
public:
InfoBLECMD(std::shared_ptr<BLEReceiver> receiver,uint32_t info) :
Command(receiver),info(info){};
~InfoCMD(){}
void Execute() const;
};
定义是这样的:
void InfoCMD::Execute() const{
this->pReceiver_->setData(this->info);
this->pReceiver_->SendData();
}
解决方法
好的,您的代码没有突出显示错误,实际上,我尝试使用以下代码重现该错误:
// Example program
#include <iostream>
#include <memory>
#include <unistd.h>
using namespace std;
class BLEReceiver {
public:
BLEReceiver(){i =1;}
virtual ~BLEReceiver(){std::cout << "destroyed" << std::endl;}
private:
int i;
};
class BLECommand {
protected:
std::shared_ptr<BLEReceiver> pBLEReceiver_;
public:
BLECommand(std::shared_ptr<BLEReceiver> receiver) : pBLEReceiver_(receiver) {}
virtual ~BLECommand() {}
virtual void Execute() const {std::cout << "execute"<<std::endl;};
};
int main()
{
std::shared_ptr<BLEReceiver> ble(std::make_shared<BLEReceiver>());
BLECommand *idreq = new BLECommand(ble);
idreq->Execute();
delete idreq;
sleep(1);
BLECommand *versionreq = new BLECommand(ble);
versionreq->Execute();
sleep(1);
delete versionreq;
}
它与输出完美配合:
execute
execute
destoyed
您可以在C++ Shell上试用。
因此,您代码中的问题是其他代码。可能您以错误的方式使用了shared_ptr,让此指针使用的内存在调用delete之前被销毁了。