永发信息网

C++ 构造函数

答案:1  悬赏:0  手机版
解决时间 2021-05-08 10:08
  • 提问者网友:玫瑰园
  • 2021-05-08 05:16

// 注释标出问题所出

#include <cstdlib>

#include <cstring>

#include <iostream>

using namespace std;

class str
{
public:

str(){ _string = 0, _size = 0; }

str(const char *pstr);

str(const str&);

int size(){ return _size; }

const char *c_str() { return _string; }

~str(){ free((void *)_string); }

private:

int _size;

char* _string;
};

str::str(const char *pstr)
{
if(!pstr)
{
_string = 0;

_size = 0;

return ;
}

_size = strlen(pstr);

// why here when use the _string = new char[_size + 1] expression cause the problem below:

// there is no source code available to the current location;


_string = (char *)malloc(_size + 1);

// do not test malloc failure

strcpy(_string, pstr);
}


str::str(const str& rhs)
{
if(rhs._string == 0)
{
_string = 0;

_size = 0;
}

else
{ // why the below statemenets cause the problem:

//Unhandled exception at 0x102d12b4 in conversion.exe: 0xC0000005: Access violation reading location 0xccccccc8.

free((void *)_string);

_size = rhs._size;

_string = (char *)malloc(_size + 1);

// do not test malloc failure

strcpy(_string, rhs._string);
}
}

int main()
{

str strobj1("C++ Premier");

str strobj2(strobj1);

std::cout << strobj1.c_str() << "\n"

<< strobj2.c_str() << "\n";
}

最佳答案
  • 五星知识达人网友:想偏头吻你
  • 2021-05-08 06:11
就是刚才那个问题吗?

注释掉复制构造函数里的free函数就ok了,估计是你逻辑不对,复制构造不同复制赋值(operator = ),只要调用了一定是构造了一个新对象,_string肯定是要初始化为0的,这之前不可能会存着有效的值,所以无需free
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯