c++在使用类方法给成员赋值时每次都会崩溃
C++ crashes evertime when using class methods to assign members values
所以基本上我到目前为止是一个代码访问类的方法通过一个对象然后分配新的值但它总是崩溃每次我尝试运行谁能告诉我我做错了什么
#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; }
相关文章:
- 为"adjacent"变量赋值时出现问题
- C++中的赋值发生,尽管右侧出现异常
- 赋值运算符在我制作类模板时使代码崩溃
- 复制赋值构造函数中的aligned_alloc内存块在释放时崩溃
- C++初始化复制构造函数中的列表赋值,并在复制构造函数中崩溃
- 为结构字段赋值时程序崩溃
- C++ 赋值崩溃
- 在 malloc 之后为数组赋值会导致崩溃
- 类成员作为对另一个的引用:赋值运算符中的崩溃
- 赋值运算符在 xcode 4 中崩溃,在MSVS2010中运行良好
- C++程序在为指针的2D数组赋值后崩溃
- memset导致std::string赋值崩溃
- 向量赋值崩溃
- 给数组赋值时崩溃
- 通过不返回引用来防止下标操作符的赋值会导致运行时崩溃
- c++在使用类方法给成员赋值时每次都会崩溃
- visualstudio-当给太多动态分配的数组赋值时程序崩溃-C++
- 是否赋值代码会导致崩溃
- 将一个glm::vec3常量引用赋值给另一个glm::vec3时奇怪的崩溃
- 自定义复制赋值操作符使程序崩溃(c++)