使用类方法分配成员值时,C ++会崩溃

时间:2013-03-07 17:15:40

标签: c++ class

基本上我到目前为止是一个代码,通过一个对象访问类方法,然后分配新的值,但它每次我尝试运行时都会崩溃,有人请告诉我我做错了什么

#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:\ Users \ 13276 \ Desktop \ Untitled3.cpp在成员函数`std :: string person :: setname(std :: string)':

C:\ Users \ 13276 \ Desktop \ Untitled3.cpp在成员函数`std :: string person :: setname(std :: string)':

F:\ Makefile.win [Build Error] [C:/Users/13276/Desktop/Untitled3.o]错误1

3 个答案:

答案 0 :(得分:3)

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

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

为了完整起见,不返回值为undefined behavior。如果您更新所有setter以返回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]

答案 1 :(得分:2)

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

在你的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]

here。您可以通过将返回类型更改为void来解决问题:

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

答案 2 :(得分:2)

您在return中缺少setname()声明。

尝试其中任何一种:

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

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

您的其他setxxx函数中存在类似的错误。