为类构造函数中的指针分配内存

时间:2012-04-12 11:40:39

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

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

"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;
...
}

5 个答案:

答案 0 :(得分:5)

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

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

您的版本:

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

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

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

答案 1 :(得分:3)

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

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

    Hangman()  { } 

private:
    std::string   remaining; 
};

“Hangman.cpp”

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

几点重要:

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

另外,请注意,在构造函数中创建一个与类成员remaining同名的本地指针最好是ambigiuos,你应该适当地重命名它。

答案 4 :(得分:1)

一方面是通过做

remaining=new char[26];

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

此致

安德烈亚斯