【问题标题】:Dev C++ keeps crashing when I run this code. I cannot figure out why运行此代码时,Dev C++ 不断崩溃。我不知道为什么
【发布时间】:2014-04-14 21:47:42
【问题描述】:

我不知道发生了什么。该程序似乎在视觉工作室上运行良好。也许我做错了什么,我找不到它。请有人帮我解决这个问题。

#include <iostream>
#include<string>
#include<cstdlib>

using namespace std;
class Aokiji
{
private:
    string name1;
    string name2;
public:
    string setName(string x)
    {
        name1=x;
    }
    string getName()
    {
        return name1;
    }
};

int main()
{
    Aokiji Grapes;
    Grapes.setName("I got it!");
    cout<< Grapes.getName()<< endl;
    system("pause");
}

【问题讨论】:

标签: c++ string function class operators


【解决方案1】:

你的 setName() 函数不返回任何东西,但它应该返回一个 std::string。您需要返回一个值,或者使 setName() 函数无效(这可能是它应该是的)

【讨论】:

  • 但是他没有使用返回值,会不会导致崩溃?
  • @ooga 函数不知道你是否使用了返回值。
  • @ooga - 如果该函数静默返回 0 或整数,则这是导致分段错误的原因。尝试为 std::string 分配一个整数,你就会明白我的意思了。
  • 那么OP的主要问题是他的警告级别设置得不够高,因为他的编译器应该警告他!
  • @qdii:为了完整起见,请注意 C 在这方面有所不同。从 C99 6.9.1/12 开始:“如果到达终止函数的 },并且调用者使用函数调用的值,则行为未定义”
【解决方案2】:

正如 PaulMacKenzie 所指出的,问题在于缺少 return 语句。这就是使用 C++ 的原因,应该始终使用-Werror=return-type 标志来确保函数不会错过返回语句。

我很惊讶 C++ 实际上允许这样做。我认为函数可能错过 return 语句的唯一情况是,如果它应该返回某些东西,但它会抛出异常,因此不会返回。但这是一个非常狭窄的用例,在这种情况下添加一个虚拟的 return 语句不会花费任何成本。

【讨论】:

    【解决方案3】:

    将代码中的 setName() 方法替换为:

    void setName(string x)
    {
        name1 = x;
    }
    

    你需要返回 0;在 int main() 中。

    【讨论】:

      猜你喜欢
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多