我正在尝试使用自己的String类在控制台中创建基于文本的冒险游戏。虽然我在指针失去它的价值时遇到了麻烦。 以下是我认为导致问题的类的减少版本。 ReadAndLog()将'string'的值设置为用户输入。当调用ToUpper()时,值仍然正确,但是在输入length函数时,'string'位置的值是垃圾数据。任何有关正在发生的事情的见解都会很棒。提前谢谢。
STRING.H:
#ifndef STRING_H_
#define STRING_H_
class String
{
public:
String();
~String();
int Length();
String & ToLower();
String & ToUpper();
void ReadAndLog();
private:
char * string;
};
#endif
String.cpp:
#include "String.h"
String::String()
{
string = nullptr;
}
String::~String()
{
if (string != nullptr)
{
delete[] string;
string = nullptr;
}
}
int String::Length()
{
if (string == nullptr)
return 0;
else
{
for (int i = 0; true; i++)
{
if (string[i] == '\0')
{
return i;
}
}
}
}
String & String::ToLower()
{
int length = Length();
for (int i = 0; i < length; i++)
{
if (string[i] >= 'A' && string[i] <= 'Z')
string[i] += 32;
}
return *this;
}
String & String::ToUpper()
{
int length = Length();
for (int i = 0; i < length; i++)
{
if (string[i] >= 'a' && string[i] <= 'z')
string[i] -= 32;
}
return *this;
}
编辑 - ReadAndLog已更改
void String::ReadAndLog()
{
char charArray[256];
std::cin.getline(charArray, 256);
for (int i = 0; true; i++)
{
if (charArray[i] == '\0')
{
if (string != nullptr)
{
delete[] string;
string = nullptr;
}
string = new char[i + 1];
for (int j = 0; j < i; j++)
{
string[j] = charArray[j];
}
string[i] = '\0';
break;
}
}
File::LogEntry((String)"User", string);
}
正在调用的代码在Game.cpp中调用:
String input;
input.ReadAndLog();
input.ToUpper();
答案 0 :(得分:0)
char charArray [256]是ReadAndLog的本地。当函数退出时它会被处理掉。你需要分配一个新的内存块(并在你的析构函数中处理它),甚至更好,使用std :: string。
答案 1 :(得分:0)
这个
char charArray[256];
//...
string = charArray;
无法运作。您实际上是将本地变量的地址分配给字符串类的成员指针。稍后您尝试通过指针访问该局部变量,但在该时间点,该变量已超出范围,并且您正在访问无效的内存地址。
您可能应该熟悉c ++中的内存管理。