Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 共享指针时,是否可以安全地删除指针向量的父级?_C++_Shared Ptr_Bnfc - Fatal编程技术网

C++ 共享指针时,是否可以安全地删除指针向量的父级?

C++ 共享指针时,是否可以安全地删除指针向量的父级?,c++,shared-ptr,bnfc,C++,Shared Ptr,Bnfc,我的一个应用程序中出现了内存泄漏问题,我正在检查并试图修复这些问题。我怀疑的问题之一是,我使用BNFC将文件中的行解析为命令: void LineStreamScriptProvider::populateQueue { 如果你应该成为一个普通人 { 塔斯cript::ShowAbsyn阵雨; std::字符串行; 当队列大小ListCommand; 对于每个列表->开始,cList->结束,[this,shower]TasScript::Command*cmd{ //记录到输出的命令%s\n,

我的一个应用程序中出现了内存泄漏问题,我正在检查并试图修复这些问题。我怀疑的问题之一是,我使用BNFC将文件中的行解析为命令:

void LineStreamScriptProvider::populateQueue { 如果你应该成为一个普通人 { 塔斯cript::ShowAbsyn阵雨; std::字符串行; 当队列大小<30&&!stream.eof时 { std::getlinestream,line; const char*lineCStr=line.c_str; TasScript::Program*lineCmds=TasScript::pProgramlineCStr; TasScript::P*asLeaf=static\u castlineCmds; TasScript::ListCommand*cList=asLeaf->ListCommand; 对于每个列表->开始,cList->结束,[this,shower]TasScript::Command*cmd{ //记录到输出的命令%s\n,shower->showcmd; std::shared_ptr cmdSharedcmd; pushToQueuecmdShared; }; } ifstream.eof { 后EOF; } } } 供参考:

P类:公共项目 { 公众: ListCommand*ListCommand; // ... 类ListCommand:public Visitable,public std::vector { // ...
BNFC使用new构造这些,然后返回指针。删除lineCmds而不删除cmdShared持有的值是否安全?

抱歉,我不知道BNFC,它会为您创建原始指针

删除lineCmds而不删除保留的值是否安全 共享吗

如果您是从原始指针创建共享指针,则共享指针将拥有该资源的所有权。共享指针将保持该资源的引用计数,直到它降至零,即当该资源的所有共享指针超出范围时,它将尝试销毁该资源

您正在创建一个共享指针并将其传递给队列:

std::shared_ptr<TasScript::Command> cmdShared(cmd);
pushToQueue(cmdShared);
然后将pushToQueue更改为接受const TasScript::Command&,而不是共享指针。这样,您就不必担心指针被破坏,因为您有一个值的副本


在while循环中,您似乎正在泄漏内存。您不需要删除lineCmds和cList吗?

与其从原始指针创建共享指针,不如首先创建一个共享指针?这就是智能指针的全部指针:管理对象的生存期。此外,您还可以通过智能poi获得异常安全NTER,即,如果在创建对象时引发异常,它们将为您删除内存。>BNFC使用newSo这样构造它们?pushToQueue需要采用共享的\u ptr,因为它以奇怪的方式跨线程访问。或者更正确的方法是什么?@Soren ListCommand是您创建的类吗?如果是,您不能更改i吗t to class ListCommand:public Visitable,public std::vector?这样您就可以处理共享指针的向量。这将是一种更好的设计,更易于在代码中使用。这样您就不需要在for_each中创建共享指针了。@Soren也许您毕竟可以复制该命令。这样,您就可以销毁指针,而不必使用它担心循环后的指针是否无效。请参阅我的第二个解决方案。
TasScript::Command cmdCopy(*cmd);