2

我正在编写一个简单的程序。里面只有一个类。有一个私有成员 'char * number' 和两个函数(会有更多,但首先这些应该可以正常工作:))。

第一个应该将“源”复制到“数字”变量中(我想这里的某个地方是问题所在):

LongNumber::LongNumber(const char * source ){
        int digits = strlen(source);

        char* number = new char[digits+1];
        strcpy( number, source );
        //  cout<<number<<endl; - if the line is uncommented,
        //  the output is correct and there isn't a problem

}

还有一个打印功能:

void LongNumber::print(){
    cout<<number<<endl;
    // when I try to print with the same line of code here..it crashes
}

当然,我错过了一些东西......但是什么?

(因为这是我的第一篇文章……您认为标签已更正……您将如何标记该帖子?)

先感谢您 :)

4

4 回答 4

6

退出构造函数时,您的 number char* 数组将超出范围。当您到达 print() 时,由于程序不再有权访问 *number 最初指向的内存,它会崩溃(即分段错误)。要解决此问题,请改为:

class LongNumber
{
     char *number;
     LongNumber(const char *source);
     ~LongNumber();
     void print();
};

LongNumber::LongNumber(const char * source ){
        int digits = strlen(source);

        number = new char[digits+1];
        strcpy( number, source );    
}

void LongNumber::print(){
    cout<<number<<endl;
}

不要忘记执行以下操作:

LongNumber::~LongNumber()
{
    delete [] number;    // to avoid memory leaks
}

我还强烈建议您使用 STL::string 而不是使用 char* 作为 *number 变量,因为您不必自己处理内存管理开销,并且复制字符串也会更容易。

于 2009-06-28T07:27:11.980 回答
5

LongNumber构造函数中,您声明一个名为的新局部变量number并使用新char数组对其进行初始化:

char* number = new char[digits+1];

相反,您应该省略char*, 以便它看起来不像新变量声明并使用对象成员变量:

number = new char[digits+1];

使用当前代码,成员变量number永远不会被初始化,并且稍后使用它print会导致错误。

于 2009-06-28T07:23:49.303 回答
1

您的问题出在构造函数中:

LongNumber::LongNumber(const char * source )
{
  ...
  // you are declaring a new local variable called `number` here
  char* number = new char[digits+1];
  strcpy( number, source );
  ...
}

您没有复制到名为 的类成员变量number中,而是在构造函数的主体中声明了一个新的局部变量并使用它。类成员变量未使用,并且可能未定义。对于指针成员,这意味着该值可以是任何无效值 - 然后当您调用 print 时:

void LongNumber::print()
{
  cout<<number<<endl;
  // when I try to print with the same line of code here..it crashes
}

您在这里使用的number是类成员变量,正如我们所说,它是未定义的。然后调用cout将崩溃,因为它试图使用该无效指针。

解决方法是让构造函数使用正确的类成员变量:

LongNumber::LongNumber(const char * source )
{
  ...
  // use the class member variable `number` here
  number = new char[digits+1];
  strcpy( number, source );
  ...
}
于 2009-06-28T07:29:08.293 回答
1

在我看来,您将数字声明为局部变量。如果您希望能够在另一个函数中再次调用它,则必须在类定义中声明它......像这样:

class LongNumber{
public:
        int digits;
        char* number;
        LongNumber(const char * source );
        void print();
}

LongNumber::LongNumber(const char * source ){
        digits = strlen(source);
        number = new char[digits+1];
        strcpy( number, source );
        //  cout<<number<<endl; - if the line is uncommented,
        //  the output is correct and there isn't a problem
}

void LongNumber::print(){
    cout<<number<<endl;
    // when I try to print with the same line of code here..it crashes
}

希望有帮助!!!

于 2009-06-28T07:30:15.767 回答