【问题标题】:Allocate memory for a pointer in a class constructor为类构造函数中的指针分配内存
【发布时间】:2012-04-12 11:40:39
【问题描述】:

我正在开发一个程序,但在涉及类时无法理解使用指针。我知道我必须使用new 为指针分配内存,并且在不使用类时对此很好。不过,我找不到一个简单的教程来解释如何执行此特定任务。有人可以给我一些帮助吗?这是我到目前为止所做的相关 sn-ps,但它正在输出随机字符:

"Hangman.c"
{

class Hangman
{
public:
...
char* remainingLetters();
Hangman()
 {
  char* remaining=new char[26];
 }
~Hangman();

private:
char* remaining;
}

"Hangman.cpp"
{

...
 char* Hangman::remainingLetters()
{
 ...does task to find remaining letters;

 return remaining;
 }

  ostream& operator<< (ostream &out, Hangman &game)
  {
    out << "Letters remaining are: " << game.remaining <<endl

    return out;
  }
}

"main.cpp"
{
...
cout << game;
...
}

【问题讨论】:

  • 您不应该在 C++ 中真正使用指针或 new,尤其是如果您是初学者。它们是图书馆开发人员的利基专家主题。
  • 以不使用指针为主题,为什么不直接将成员变量声明为数组呢? IE。 char remaining[26]; 那你就不用担心内存泄漏之类的事情了,比如忘记释放析构函数中的内存。
  • @JoachimPileborg 每次调用该函数时我都需要返回一个数组,如果我没记错的话,这不能在 C++ 中完成。这就是我尝试使用指针的原因。在这种情况下是否有可能得到一个数组输出?
  • 一个数组可以转换为同类型的指针,即你可以做类似char array[26]; char *pointer = array; printf("pointer[1] = '%c'\n", pointer[1]);
  • @adohertyd - 您可以使用std::string 来存储您的信件。返回 C++ 字符串没有问题,只返回数组。

标签: c++ class memory-management constructor operator-overloading


【解决方案1】:

你没有初始化你的成员。你应该有:

Hangman()
{
   remaining=new char[26];
}

你的版本:

 Hangman()
 {
    char* remaining=new char[26];
 }

初始化一个名为remaining的局部变量,其作用域是构造函数。

另外你应该delete[]析构函数中的内存并实现复制构造函数和赋值运算符。

【讨论】:

  • "实现拷贝构造函数OR赋值运算符"不!应该是"实现拷贝构造函数AND 赋值运算符"
  • 这是正确答案。仍然没有代码工作。必须在这个主题上做更多的阅读。感谢您的输入
【解决方案2】:

如果您使用 C++ 字符串而不是 C 样式的 char 数组,大多数问题都会消失。

class Hangman 
{ 
public:
    std::string remainingLetters(); 

    Hangman()  { } 

private:
    std::string   remaining; 
};

“刽子手.cpp”

std::string Hangman::remainingLetters() 
{
    //  ...does task to find remaining letters;
   return remaining;  
} 

【讨论】:

    【解决方案3】:
    Hangman()
    {
      char* remaining=new char[26];
    }
    

    在构造函数中,您正在初始化一个局部变量,而不是类成员。此外,每个new/new[] 都应分别与delete/delete[] 关联以避免内存泄漏。与其自己管理内存,不如使用智能指针。

    【讨论】:

      【解决方案4】:

      几个重点:

      • 您需要使用new [] 为构造函数中的指针成员分配内存。
      • 您需要在析构函数中使用delete [] 释放内存。
      • 您需要遵守三法则。

      另外,请注意,在构造函数中创建与您的类成员 remaining 同名的本地指针充其量是模棱两可的,您应该适当地重命名它。

      【讨论】:

        【解决方案5】:

        一方面是通过做

        remaining=new char[26];
        

        您正在为 25 个字母(+ 一个 0 字节)保留空间,这可能不是您想要的...

        问候

        安德烈亚斯

        【讨论】:

          猜你喜欢
          • 2015-08-22
          • 1970-01-01
          • 2019-09-23
          • 1970-01-01
          • 1970-01-01
          • 2019-07-08
          • 1970-01-01
          • 2016-07-29
          • 2015-03-12
          相关资源
          最近更新 更多