指针问题.. ( C++ )

Posted

技术标签:

【中文标题】指针问题.. ( C++ )【英文标题】:Pointer Issues.. ( C++ ) 【发布时间】:2009-04-18 02:26:09 【问题描述】:

就在我以为我已经弄明白的时候,我收到了一个异常处理错误。问题:问题在于私有成员在构造函数之外丢失了信息。这是我的类定义

代码:

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.

【问题讨论】:

我尝试使用格式
 :(
【参考方案1】:
    这不是有效的 C++ 代码。 如果您使用的是 C++,您不应该 使用 std::string 作为字符串? 基于另一个的构造函数 实例应该是ClassType(const ClassType& rhs)

【讨论】:

我完全同意。这不应该编译或运行。【参考方案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() 需要返回声明

【讨论】:

【参考方案3】:

这是真正的代码吗?

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;

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

默认构造函数是那些所有参数都有默认值的构造函数,所以你的带指针的构造函数不是默认构造函数。

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

您能否发布主要内容,因为这可能是解决问题的关键?

【讨论】:

以上是关于指针问题.. ( C++ )的主要内容,如果未能解决你的问题,请参考以下文章

带有空指针的 2D 指针数组 c++

将指针数组传递给函数指针数组的 C++ 问题

在 C++ 中使用指针和指向指针的指针读取和存储序列化对象的快速方法

C++ 智能指针性能

C++ 指针问题

C++多态与this指针问题