c++在使用类方法给成员赋值时每次都会崩溃

C++ crashes evertime when using class methods to assign members values

本文关键字:崩溃 赋值 成员 类方法 c++      更新时间:2023-10-16

所以基本上我到目前为止是一个代码访问类的方法通过一个对象然后分配新的值但它总是崩溃每次我尝试运行谁能告诉我我做错了什么

#include <iostream> 
#include <fstream>
#include <string> 
using namespace std; 
class person
{
      private:
              string name;
              string age;
              string country;
              string food;
              string sex;
              string drink;
      public:
             string setname(string input){name=input;}
             string setage(string input){age=input;}
             string setcountry(string input){country=input;}
             string setfood(string input){food=input;}
             string setsex(string input){sex=input;}
             string setdrink(string input){drink=input;}
             string showname(){return name;}
             string showage(){return age;}
             string showcountry(){return country;}
             string showfood(){return food;}
             string showsex(){return sex;}
             string showdrink(){return drink;}
};
int main() 
{ 
  //ofstream logwrite("test.txt"); 
  cout<<"Create Person? (y/n) ";
  string anwser;
  cin>>anwser;
  if (anwser=="y")
  {
  person object;
  cout<<"Name? ";
  string name;
  cin>>name;
  object.setname(name);
  cout<<object.showname();
  }
  //logwrite.close(); 
  return 0; 
}

对不起,我写这篇文章的时候有点匆忙,因为我的课结束了,我没有多余的时间。我使用dev - c++作为编译器,所以我不知道它是否支持警告或任何东西,但它产生这些错误消息

C:Users13276DesktopUntitled3.cpp In member function ' std::string person::setname(std::string)':

C:Users13276DesktopUntitled3.cpp In member function ' std::string person::setname(std::string)':

F: Makefile。win [Build Error] [C:/Users/13276/Desktop/Untitled3. cn]0]错误1

所以看起来你有所有的setter声明为返回string,但你没有这样做。我猜你指的是void:

void setname(string input){name=input;}

为了完整起见,不返回值是未定义的行为。如果你更新所有的设置返回void,那么它似乎解决了问题。

正如评论中提到的,如果你看到了警告,你可能会立即发现问题。下面的内容:

Compilation finished with warnings:
source.cpp: In member function 'std::string person::setname(std::string)':
source.cpp:15:54: warning: no return statement in function returning non-void [-Wreturn-type]

您在setname()中缺少一个return语句。

试试下面任意一个:

string setname(string input){return name=input;}
void setname(string input){name=input;}

你的其他setxxx函数也有类似的bug

程序正在崩溃,因为它试图清理一个不存在的字符串对象。

在你的set方法中,你没有返回值(即使你的方法声明说它应该返回值)。这是未定义的行为:

string setname(string input){name=input;}
然而,生成的代码将尝试释放一个字符串对象,并且free调用将失败,因为它试图释放堆栈上剩余的一些随机内存地址:
*** glibc detected *** ./prog: free(): invalid pointer: 0x08049110 ***
======= Backtrace: =========
/lib/i386-linux-gnu/i686/cmov/libc.so.6(+0x6e3f1)[0xb76103f1]
/lib/i386-linux-gnu/i686/cmov/libc.so.6(+0x6fc58)[0xb7611c58]
/lib/i386-linux-gnu/i686/cmov/libc.so.6(cfree+0x6d)[0xb7614d0d]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdlPv+0x1f)[0xb77904bf]
/lib/i386-linux-gnu/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xb75b8e46]
./prog[0x8048b21]

如下所示。您可以通过将返回类型更改为void:

来解决这个问题。
void setname(string input) { name = input; }