指针问题.. ( 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++ )的主要内容,如果未能解决你的问题,请参考以下文章