请指点Bug在哪里

ProgrammingRing 2013-04-25 08:03:54
下面的代码的标记处说是个bug,我实在看不明白那里为什么是个bug,请指点那里为什么是bug啊...

class CMyString
{
public:
CMyString();
CMyString(CMyString& obj);
CMyString(char *pstrBuff);
~CMyString();

void SetString(char *pstrBuff);
char* GetString();

int GetStringLen();

private:
char *m_pstrBuff;
};

CMyString::CMyString()
{
m_pstrBuff = NULL;
}
CMyString::CMyString(CMyString& obj)
{
m_pstrBuff = NULL;
this->SetString(obj.GetString());
}
CMyString::CMyString(char *pstrBuff)
{
m_pstrBuff = NULL;
SetString(pstrBuff);
}
CMyString::~CMyString()
{
if (m_pstrBuff != NULL)
{
delete [] m_pstrBuff;
m_pstrBuff = NULL;
}
}

void CMyString::SetString(char *pstrBuff)
{
if (m_pstrBuff != NULL)
{
delete [] m_pstrBuff;
m_pstrBuff = NULL;
}

int nLen = strlen(pstrBuff);
m_pstrBuff = new char[nLen + sizeof(char)];

do
{
m_pstrBuff[nLen] = pstrBuff[nLen];
nLen--;
} while (nLen >= 0);

}
char* CMyString::GetString()
{
return m_pstrBuff;
}
int CMyString::GetStringLen()
{
int nLen = 0;
do
{
nLen++;
} while (m_pstrBuff[nLen]);
return nLen;
}


CMyString ShowString(CMyString MyString)
{
CMyString MyStringRet;

char szBuff[50] = {0};
scanf("%50s", szBuff);

printf("%s\r\n", MyString.GetString());

MyStringRet.SetString(szBuff);

return MyStringRet;
}

int main(int argc, char* argv[])
{
char szBuff[50] = {0};
scanf("%50s", szBuff);
CMyString * pMyString = NULL;

CMyString MyString(szBuff);

CMyString MyStringRet = ShowString(MyString);

printf("%s\r\n", MyStringRet.GetString());


// 堆对象的使用
pMyString = new CMyString[2];

if (pMyString == NULL)
{
return -1;
}

pMyString[0].SetString(MyStringRet.GetString());
pMyString[1].SetString(MyString.GetString());
printf("%s %s\r\n", (*pMyString).GetString(), (*(pMyString+1)).GetString());

if (pMyString != NULL)
{
delete [] pMyString; // BUG所在处
pMyString = NULL;
}

return 0;
}
...全文
294 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bsnry 2013-04-29
  • 打赏
  • 举报
回复
sscanf用错了。 49就行了, 会自动加上一个'\0'. 另外:每次sscanf会从控制台的缓冲区里再次提取数据。 所以: 使用之前 fflush(stdin)一次
引用 楼主 ProgrammingRing 的回复:
下面的代码的标记处说是个bug,我实在看不明白那里为什么是个bug,请指点那里为什么是bug啊...

class CMyString
{
public:
	CMyString();
	CMyString(CMyString& obj);
	CMyString(char *pstrBuff);
	~CMyString();

	void SetString(char *pstrBuff);
	char* GetString();
	
	int GetStringLen();

private:
	char *m_pstrBuff;
};

CMyString::CMyString()
{
	m_pstrBuff = NULL;
}
CMyString::CMyString(CMyString& obj)
{
	m_pstrBuff = NULL;
	this->SetString(obj.GetString());
}
CMyString::CMyString(char *pstrBuff)
{
	m_pstrBuff = NULL;
	SetString(pstrBuff);
}
CMyString::~CMyString()
{
	if (m_pstrBuff != NULL)
	{
		delete [] m_pstrBuff;
		m_pstrBuff = NULL;
	}
}

void CMyString::SetString(char *pstrBuff)
{
	if (m_pstrBuff != NULL)
	{
		delete [] m_pstrBuff;
		m_pstrBuff = NULL;
	}

	int nLen = strlen(pstrBuff);
	m_pstrBuff = new char[nLen + sizeof(char)];

	do 
	{
		m_pstrBuff[nLen] = pstrBuff[nLen];
		nLen--;
	} while (nLen >= 0);

}
char* CMyString::GetString()
{
	return m_pstrBuff;
}
int CMyString::GetStringLen()
{
	int nLen = 0;
	do 
	{
		nLen++;
	} while (m_pstrBuff[nLen]);
	return nLen;
}


CMyString ShowString(CMyString MyString)
{
	CMyString MyStringRet;

	char szBuff[50] = {0};
	scanf("%50s", szBuff);

	printf("%s\r\n", MyString.GetString());

	MyStringRet.SetString(szBuff);

	return MyStringRet;
}

int main(int argc, char* argv[])
{
	char szBuff[50] = {0};
	scanf("%50s", szBuff);
	CMyString * pMyString = NULL;

	CMyString MyString(szBuff);
	
	CMyString MyStringRet = ShowString(MyString);

	printf("%s\r\n", MyStringRet.GetString());


	// 堆对象的使用
	pMyString = new CMyString[2];

	if (pMyString == NULL)
	{
		return -1;
	}

	pMyString[0].SetString(MyStringRet.GetString());
	pMyString[1].SetString(MyString.GetString());
	printf("%s %s\r\n", (*pMyString).GetString(), (*(pMyString+1)).GetString());

	if (pMyString != NULL)
	{
		delete [] pMyString;		// BUG所在处
		pMyString = NULL;
	}
	
	return 0;
}
引用 楼主 ProgrammingRing 的回复:
下面的代码的标记处说是个bug,我实在看不明白那里为什么是个bug,请指点那里为什么是bug啊...

class CMyString
{
public:
	CMyString();
	CMyString(CMyString& obj);
	CMyString(char *pstrBuff);
	~CMyString();

	void SetString(char *pstrBuff);
	char* GetString();
	
	int GetStringLen();

private:
	char *m_pstrBuff;
};

CMyString::CMyString()
{
	m_pstrBuff = NULL;
}
CMyString::CMyString(CMyString& obj)
{
	m_pstrBuff = NULL;
	this->SetString(obj.GetString());
}
CMyString::CMyString(char *pstrBuff)
{
	m_pstrBuff = NULL;
	SetString(pstrBuff);
}
CMyString::~CMyString()
{
	if (m_pstrBuff != NULL)
	{
		delete [] m_pstrBuff;
		m_pstrBuff = NULL;
	}
}

void CMyString::SetString(char *pstrBuff)
{
	if (m_pstrBuff != NULL)
	{
		delete [] m_pstrBuff;
		m_pstrBuff = NULL;
	}

	int nLen = strlen(pstrBuff);
	m_pstrBuff = new char[nLen + sizeof(char)];

	do 
	{
		m_pstrBuff[nLen] = pstrBuff[nLen];
		nLen--;
	} while (nLen >= 0);

}
char* CMyString::GetString()
{
	return m_pstrBuff;
}
int CMyString::GetStringLen()
{
	int nLen = 0;
	do 
	{
		nLen++;
	} while (m_pstrBuff[nLen]);
	return nLen;
}


CMyString ShowString(CMyString MyString)
{
	CMyString MyStringRet;

	char szBuff[50] = {0};
	scanf("%50s", szBuff);

	printf("%s\r\n", MyString.GetString());

	MyStringRet.SetString(szBuff);

	return MyStringRet;
}

int main(int argc, char* argv[])
{
	char szBuff[50] = {0};
	scanf("%50s", szBuff);
	CMyString * pMyString = NULL;

	CMyString MyString(szBuff);
	
	CMyString MyStringRet = ShowString(MyString);

	printf("%s\r\n", MyStringRet.GetString());


	// 堆对象的使用
	pMyString = new CMyString[2];

	if (pMyString == NULL)
	{
		return -1;
	}

	pMyString[0].SetString(MyStringRet.GetString());
	pMyString[1].SetString(MyString.GetString());
	printf("%s %s\r\n", (*pMyString).GetString(), (*(pMyString+1)).GetString());

	if (pMyString != NULL)
	{
		delete [] pMyString;		// BUG所在处
		pMyString = NULL;
	}
	
	return 0;
}
引用 楼主 ProgrammingRing 的回复:
下面的代码的标记处说是个bug,我实在看不明白那里为什么是个bug,请指点那里为什么是bug啊...

class CMyString
{
public:
	CMyString();
	CMyString(CMyString& obj);
	CMyString(char *pstrBuff);
	~CMyString();

	void SetString(char *pstrBuff);
	char* GetString();
	
	int GetStringLen();

private:
	char *m_pstrBuff;
};

CMyString::CMyString()
{
	m_pstrBuff = NULL;
}
CMyString::CMyString(CMyString& obj)
{
	m_pstrBuff = NULL;
	this->SetString(obj.GetString());
}
CMyString::CMyString(char *pstrBuff)
{
	m_pstrBuff = NULL;
	SetString(pstrBuff);
}
CMyString::~CMyString()
{
	if (m_pstrBuff != NULL)
	{
		delete [] m_pstrBuff;
		m_pstrBuff = NULL;
	}
}

void CMyString::SetString(char *pstrBuff)
{
	if (m_pstrBuff != NULL)
	{
		delete [] m_pstrBuff;
		m_pstrBuff = NULL;
	}

	int nLen = strlen(pstrBuff);
	m_pstrBuff = new char[nLen + sizeof(char)];

	do 
	{
		m_pstrBuff[nLen] = pstrBuff[nLen];
		nLen--;
	} while (nLen >= 0);

}
char* CMyString::GetString()
{
	return m_pstrBuff;
}
int CMyString::GetStringLen()
{
	int nLen = 0;
	do 
	{
		nLen++;
	} while (m_pstrBuff[nLen]);
	return nLen;
}


CMyString ShowString(CMyString MyString)
{
	CMyString MyStringRet;

	char szBuff[50] = {0};
	scanf("%50s", szBuff);

	printf("%s\r\n", MyString.GetString());

	MyStringRet.SetString(szBuff);

	return MyStringRet;
}

int main(int argc, char* argv[])
{
	char szBuff[50] = {0};
	scanf("%50s", szBuff);
	CMyString * pMyString = NULL;

	CMyString MyString(szBuff);
	
	CMyString MyStringRet = ShowString(MyString);

	printf("%s\r\n", MyStringRet.GetString());


	// 堆对象的使用
	pMyString = new CMyString[2];

	if (pMyString == NULL)
	{
		return -1;
	}

	pMyString[0].SetString(MyStringRet.GetString());
	pMyString[1].SetString(MyString.GetString());
	printf("%s %s\r\n", (*pMyString).GetString(), (*(pMyString+1)).GetString());

	if (pMyString != NULL)
	{
		delete [] pMyString;		// BUG所在处
		pMyString = NULL;
	}
	
	return 0;
}
ProgrammingRing 2013-04-25
  • 打赏
  • 举报
回复
我也觉得没bug,可是那里标注了有bug……不会是标错了吧..
lzjamao 2013-04-25
  • 打赏
  • 举报
回复
引用 4 楼 MAOMAOXIAOHUO 的回复:
我用VS2010运行的,LZ说的BUG,
我用VS2010运行的,没有LZ说的BUG
lzjamao 2013-04-25
  • 打赏
  • 举报
回复
我用VS2010运行的,LZ说的BUG,
palm008 2013-04-25
  • 打赏
  • 举报
回复
你在
void CMyString::SetString(char *pstrBuff)
中已经删除字符串了,怎么对字符串又进行strlen呢?
nirvana_newbie 2013-04-25
  • 打赏
  • 举报
回复
windowsXP下VC6.0编译无错,运行无内存泄露问题。此图见证:
大神送一血 2013-04-25
  • 打赏
  • 举报
回复
ShowString 返回局部对象,析构后指针为空,然后又delete空指针?
ProgrammingRing 2013-04-25
  • 打赏
  • 举报
回复
调试半天,还是看不出那里为啥是个bug……难道是书的作者搞错了?放了一个没bug的代码,还是我没看出?还再请大牛过过眼
赵4老师 2013-04-25
  • 打赏
  • 举报
回复
对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧