【问题标题】:Where to delete returned char*在哪里删除返回的 char*
【发布时间】:2015-06-13 18:36:25
【问题描述】:

我有一个家庭作业要实现一个公牛和奶牛游戏类,我们的导师给了我们一个标题,我们必须实现它,里面有这个功能

char* TryToGuess(int);

它的作用是接收一个 int 并返回 char*,其中包含您猜到的公牛和奶牛的数量。我所做的是创建一个字符串,传递其中的所有信息,然后将其转换为 char*,如下所示:

string result = "Cows:";
char c = char(cows + '0');
result += c;
result += "    Bulls:";
char b = char(bulls + '0');
result += b;
char* finalResult = new char[18];
strcpy(finalResult, result.c_str());
return finalResult;

我们还有一个名为 start 的函数,用于执行我们的游戏,我的代码是

char* result;
int guess;
do
{
    cout << "Your guess:";
    cin >> guess;
    result = TryToGuess(guess);
    cout << "\t\t\t[" << guess << "] => " << result << endl;
} while (result != "Congarulations! You made a right guess!");
cout << "\n\n\t\t It took you " << numberOfGuesses << " guesses to finish the game.\n";

问题是存在内存泄漏,我不知道将 delete[] 放在哪里,它不能在循环内,因为不会满足 while 中的条件。提前感谢您的帮助。

PS:我不能把返回类型改成字符串,我的导师是这样设置的。

PS2:这是完整的标题

#ifndef BULLSANDCOWS_H_
#define BULLSANDCOWS_H_
class BullsAndCows
{
    public:
        BullsAndCows(int = 4);
        BullsAndCows(int[], int);

        void SetContainerSize(int);
        void SetContainer(int*);

        bool IsInsideContainer(int);
        bool CowElement(int*, int, int);
        bool BullElement(int*, int, int);
        char* TryToGuess(int);
        void start();

       // void print();

    private:
        int sizeOfContainer;
        int* numbersContainer;
        int numberOfGuesses;
};

#endif // BULLSANDCOWS_H_

【问题讨论】:

  • char c = char(cows + '0'); 是否有 cows 变量?
  • 是的,这只是代码的结尾,我确定它只是一个数字
  • 在函数内部使用std::string 似乎很奇怪,然后返回char* 获取结果。此外,您将 cowsbulls 转换为字符的方式只有在每个字符少于 10 个时才有效。
  • 你能显示完整的标题吗?另外,我怀疑你被教坏习惯(事实上,这似乎是c++ 考虑到cout 的用法,但随后你被要求使用原始指针来表明这一点)
  • 1) 您不能将char*== 进行比较,就像您在while 条件下所做的那样,请使用strcmp。 2)在这种情况下,没有单一的解决方案。你可以用NULL初始化result,把if条件放在循环的开头,如果result不为空,那么做delete。 3)您还需要正确分配内存。字符串的大小并不总是 18。

标签: c++ arrays char return


【解决方案1】:

使用完循环后,每次循环都需要delete result[]。否则,您将在下次分配给变量时泄漏该内存。但这也意味着你不能在while 子句中使用result,因为它已经被删除了。您必须在循环内对此进行测试。

bool done = false;
do
{
    cout << "Your guess:";
    cin >> guess;
    result = TryToGuess(guess);
    cout << "\t\t\t[" << guess << "] => " << result << endl;
    done = strcmp(result, "Congarulations! You made a right guess!") == 0;
    delete result[];
} while (!done);

还要注意,您不要使用== 来比较C 字符串(它将比较指针值,而不是字符串的内容),您必须使用strcmp

【讨论】:

  • 你删除变量,然后检查它是否等于某个东西。
  • 我承认我生疏了,但这不就相当于释放后的使用吗?
  • 谢谢你和 Nikolay,现在它工作正常,没有内存泄漏 :)
猜你喜欢
  • 2011-03-29
  • 2014-06-04
  • 2015-11-26
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
相关资源
最近更新 更多