【发布时间】:2020-03-15 03:19:11
【问题描述】:
我正在尝试修复的一个应用程序中出现内存泄漏问题。我怀疑的问题之一是我使用 BNFC 将文件中的行解析为命令:
void LineStreamScriptProvider::populateQueue()
{
if(shouldPopulate())
{
TasScript::ShowAbsyn shower;
std::string line;
while(queueSize() < 30 && !stream.eof())
{
std::getline(stream, line);
const char* lineCStr = line.c_str();
TasScript::Program* lineCmds = TasScript::pProgram(lineCStr);
TasScript::P* asLeaf = static_cast<TasScript::P*>(lineCmds);
TasScript::ListCommand* cList = asLeaf->listcommand_;
for_each(cList->begin(), cList->end(), [this, shower](TasScript::Command* cmd) {
// log_to_sd_out("Parsed command %s\n", shower->show(cmd));
std::shared_ptr<TasScript::Command> cmdShared(cmd);
pushToQueue(cmdShared);
});
}
if(stream.eof())
{
afterEOF();
}
}
}
供参考:
class P : public Program
{
public:
ListCommand *listcommand_;
// ...
class ListCommand : public Visitable, public std::vector<Command*>
{
// ...
BNFC 使用new 构造这些,然后返回指针。在不删除cmdShared 持有的值的情况下,delete lineCmds 是否安全?
【问题讨论】:
-
与其从原始指针创建共享指针,不如一开始就创建共享指针?这就是智能指针的全部内容:管理对象的生命周期。此外,您还可以通过智能指针获得异常安全性,即如果在创建对象时引发异常,它们会为您删除内存。
-
> BNFC 使用
new构造这些
标签: c++ shared-ptr bnfc