【问题标题】:Program frozen after memory de-allocation内存释放后程序冻结
【发布时间】:2019-09-08 11:51:22
【问题描述】:

在我的内存释放过程中,我的代码存在一些问题。这是我得到的错误:

bool LinkedList::addArtist(){
    cout << "Enter artist name: ";
    char *name = new char[0]();
    cin >> name;
    cin.ignore(1);
    '/n';

    cout << "Enter artists top story: ";
    char *topStory = new char[0];
    cin >> topStory;
    cin.ignore(1);
    '/n';

    cout << "Enter artist description: ";
    char *description = new char[0];
    cin >> description;
    cin.ignore(1);
    '/n';

    this->addAtBeginning(*&name, *&topStory, *&description);

    cout << "made it out" << endl;
    delete[] name;
    delete[] topStory;
    delete[] description;
    return true;
}

如您所见,我收到“成功”通知,但我的程序被冻结并且不允许我做任何事情。有什么想法吗?

【问题讨论】:

  • 完全不分配任何字符来存储您的输入是非常乐观的;你甚至不能在那里存储空字符串。这不可避免地会导致未定义的行为。
  • 请提供文本信息,而不是文本图片。
  • *&amp;name 通常写成name,其他两个参数也是如此。
  • 合理的编译器会在'/n'; 的行上显示“警告:语句无效”。您是否希望那些打印换行符?

标签: c++ arrays string memory-management dynamic


【解决方案1】:

这是可怕的 UB。您分配长度为0char 数组,然后轻轻地将数据输入其中:保证缓冲区溢出!

尝试使用string 而不是char[]。它不仅可以处理动态长度,而且还可以让您摆脱手动内存管理的职责。

bool LinkedList::addArtist(){
    cout << "Enter artist name: ";
    string name;
    getline (cin, name);  // allows blanks in string and ignores \n

    ...      

    this->addAtBeginning(name, topStory, description);

    cout << "made it out" << endl;
    return true;
}

如果其余代码以相同方式使用char 数组,只需将所有内容重构为string。但是,如果您有很多代码已经可以很好地用于 char 数组并且真的不想触及它,那么您可以将string x; 作为const char* 参数与x.c_str() 一起传递。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 2010-10-26
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多