【发布时间】:2018-08-29 23:00:30
【问题描述】:
我正在学习 C++ 中的动态内存分配和重载运算符。 我正在尝试一个简单的程序来测试我的知识,但我无法找出我做错了什么。 代码如下:
#include <iostream>
#include <cstring>
using namespace std;
class myClass{
private:
char *ptr;
public:
myClass () {}
myClass (char *str)
{
ptr = new char[strlen(str)];
strcpy(ptr, str);
}
myClass (const myClass &k)
{
ptr= new char [strlen(k.ptr)+1];
strcpy(ptr, k.ptr);
}
myClass& operator= (const myClass k)
{
delete [] ptr;
ptr = new char [strlen(k.ptr)+1];
strcpy(ptr, k.ptr);
return *this;
}
~myClass() {
delete [] ptr;
}
void print() {
cout<<*ptr;
}
};
int main() {
char s[6]="Hello";
myClass p(s), m;
m=p;
m.print();
return 0;
}
我正在尝试使用运算符 =,因此我可以将 ptr 的值从对象 p 分配给对象 m,但我没有得到任何输出。任何想法我做错了什么?
【问题讨论】:
-
myClass& operator= (const myClass k)应该是myClass& operator= (const myClass& k)。不确定这是否能解决您的问题,但这是错误的。 -
myClass (const myClass &k)应该是myClass (const myClass &k):myClass(k.ptr){}。myClass (char *str)应该是myClass (char const*str)。这两个都不是您的问题的原因。 -
@Yakk 修复了它,现在我只得到“H”作为输出。
-
默认构造函数不初始化
ptr。当默认构造的myClass超出范围时,delete[]将在未初始化的ptr上被调用,如果幸运的话会导致崩溃。你还在吗?跟我说话。 -
在
myClass (char *str)你没有分配足够的字节,导致未定义的行为。如果你解决了这个问题,那么你应该看到H作为输出(因为你决定输出ptr[0]而不是ptr)
标签: c++ operator-overloading dynamic-memory-allocation