指针问题..(C ++)

时间:2009-04-18 02:26:10

标签: c++ pointers

就在我认为我弄清楚的时候,我收到了异常处理错误。问题:问题是私有成员丢失了构造函数之外的信息。这是我的班级定义

代码:

class ClassType
{
    private:
             char *cPointer;
             int length;

    public:
            ClassType();
            // default constr. needed when allocating  in main.
            ClassType( const ClassType* );
            char otherFunc();    
};

classtype.cpp:

"#include ClassType.h"

ClassType( const ClassType* )
{
    cPointer = ClassType->cPointer;
    length = ClassType->length;
}

ClassType::ClassType( const char *myVar )
{
    cPointer = new char[ strlen( myVar ) + 1 ]  //+1 for trailing '\0'
    strcpy( cPointer, myVar );
    length = strlen( cPointer );
}

char ClassType::otherFunc()
{
    cPointer;  // Nothing is shown when debugging..
    cPointer = "MyPointer"; // Results in  acrash
    length = 5; // Results in a crash
}

// The main function is working properly.

5 个答案:

答案 0 :(得分:4)

  1. 这不是有效的C ++代码。
  2. 如果您使用的是C ++,那么不应该 使用std :: string作为字符串?
  3. 基于另一个的构造函数 实例应为ClassType(const ClassType& rhs)

答案 1 :(得分:2)

我无法想到为什么它会在你指出的地方崩溃,但你的代码存在一些问题(其中一些是编译时问题,所以我们无法确定这段代码是否能准确反映问题):

  • 存在所有权问题 - 调用ClassType::ClassType( const ClassType* )时,ClassType的哪个实例拥有cPointer指向的对象?
  • 没有dtor来释放在`ClassType :: ClassType(const char * myVar)'中分配的内存
  • 由于cPointer可能指向由new分配的内容,或者可能没有,因此您在尝试确定何时应删除new分配的内容时会遇到问题。

就编译时错误而言:

  • ClassType( const ClassType* )的定义应以ClassType::ClassType( const ClassType* )
  • 开头
  • ClassType::ClassType( const ClassType* )的内容应使用参数而不是ClassType类名作为指针
  • char ClassType::otherFunc()需要退货声明

答案 2 :(得分:2)

这是真正的代码吗?

ClassType( const ClassType* )
{
    cPointer = ClassType->cPointer;
    length = ClassType->length;
}

如果是这样,它必须是这样的:

ClassType( const ClassType* rhs )
{
    cPointer = rhs->cPointer;
    length = rhs->length;
}

此外,此构造函数不是默认的ctor:

ClassType( const ClassType* ); // default constr. needed when allocating  in main.

默认ctor特别是一个接受零参数或所有参数都指定了默认值的ctor。换句话说,默认的ctor是一个可以这样调用的ctor:

ClassType myObject;

答案 3 :(得分:1)

我在other question about this code中提供了一个非常完整的答案。我认为主要问题是你的拷贝构造函数被大量破坏了。它会导致双重免费错误和其他不良。此外,由于析构函数在您分配的指针上调用delete,因此您无法将字符串文字分配给类指针。

答案 4 :(得分:0)

默认构造函数是所有参数都具有默认值的构造函数,因此接受指针的构造函数不是默认构造函数。

您的崩溃位置表明该类尚未正确构建,因此您在分配时可能会收到地址错误。

你能发帖发帖,因为这可能是看问题的关键吗?