c++ - SIGNALSEGV (segmentation fault) out of vector pushback方法
问题描述
我正在使用 linux (WSL) 制作外壳。由于某些未知的原因,当我将一个结构指针(我制作的)推回一个向量时,它调用了 SIGNALSEGV。
这些是有问题的代码的主要类,
class TimeoutCommand : public BuiltInCommand {
public:
bool background;
std::string line;
int pid;
int duration;
TimeoutCommand(const char* cmd_line); //prepare line
virtual ~TimeoutCommand() {}
void execute() override; ////set alarm + fork + add to joblist + add to timelist
};
class TimeoutList{
public:
struct TimeoutEntry {
std::string line;
int pid;
time_t start_time;
int duration;
TimeoutEntry(int pid,time_t start_time,std::string line,int duration)
:pid(pid),start_time(start_time),line(line),duration(duration)
{};
};
std::vector<TimeoutEntry*> TimeoutVec;
TimeoutList();
~TimeoutList() {
for (TimeoutEntry *entry : TimeoutVec)
delete entry;
}
void addCommand(TimeoutCommand* cmd); ////add new timeout
void timeoutCheck(); ////timout timedoutcommands
};
这是 TimeoutCommand 构造函数和调用有问题的函数的行:
TimeoutCommand::TimeoutCommand(const char *cmd_line)
:BuiltInCommand(cmd_line)
{
_parseCommandLine(cmd_line,args);
background=_isBackgroundComamnd(cmd_line);
for(int i=2;args[i]!=NULL;i++) {
line +=args[i];
}
duration=stoi(args[1]);
}
void TimeoutCommand::execute() {
alarm(duration);
**SmallShell::getInstance().timouts->addCommand(this);**
...
...
...
最后是有问题的功能:
void TimeoutList::addCommand(TimeoutCommand *cmd) {
time_t t= time(NULL);
if (t==-1){
perror("smash error: time failed");
return;
}
TimeoutEntry* entry = new TimeoutEntry(cmd->pid,t,cmd->line,cmd->duration);
**TimeoutVec.push_back(entry);**
}
是什么导致分段错误?我没有立即看到任何奇怪的指针混乱或类似的东西。
运行这个命令看起来像: timeout 3 sleep 10
这将是 cmd_line
这是 std::vector 中导致段错误的部分
push_back(const value_type& __x)
{
**if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)**
{
_GLIBCXX_ASAN_ANNOTATE_GROW(1);
_Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
__x);
++this->_M_impl._M_finish;
_GLIBCXX_ASAN_ANNOTATE_GREW(1);
}
else
_M_realloc_insert(end(), __x);
}
**有问题的线路标有** **
解决方案
问题是我初始化了一个指向 TimeoutList 实例的指针,而没有分配一个新的 istance。
推荐阅读
- html - 如何在反应中编辑任何发布的文本
- python - 将 excel 行连接到要在 pandas DataFrame 中使用的单个字符串
- python - 如何在 Django 的实例方法中使用类属性?
- scala - 从响应体中提取加特林时间
- html - 如何修复 Blogger 主题的架构标记错误和警告?
- c# - 在asp.net c#中以字符串格式比较2个日期
- rest - 如何在 React 应用和 ThingHttp 上使用 IFTTT 接收电子邮件通知?
- kotlin - Jackson 忽略不是布尔值但名称以“is”开头的数据类字段
- r - 如何获取值最接近 0 的列名?
- php - 如何将变量从python脚本传递到php并在网页中显示