C++基本问题求教:自定义的string1 (kingofark)

kingofark 2001-12-10 11:46:38
用Borland C++ Compiler 5.5 编译通过,运行正常;
用Visual C++ 6.0 编译通过,运行的时候出现“写”错误。
程序注释中有部分疑惑。

#include <iostream>
#include <string>

using namespace std;

class string1
{
public:
string1(char* value):data(value) { }
~string1() { delete[] data; }
string1(const string1& str) { data = str.data; }
string1& operator=(string1& str)
{
if (this == &str)
return *this;
delete[] data;
data = new char[20];
strcpy(data, str.data);
return *this;
}
operator char * () const { return data; } //干嘛用的?怎么使用?

private:
char* data;
};

int main()
{
char* p1;
p1 = new char[20];
strcpy(p1, "abcdef");
cout << "p1 = " << p1 << " " << &p1 << endl;

string1 str("abcd");
cout << "str = " << str << endl; // ???

p1 = str;
cout << "p1 = str, p1 = " << p1 << endl;

strcpy(p1,"sdf"); // 在 MSVC 6 中,这里出现“写”错误
cout << "strcpy(p1, \"sdf\"), p1 = " << p1 << endl;

delete[] p1;
p1 = NULL;
return 0;
}

请大家不吝赐教,谢谢!
...全文
88 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingofark 2001-12-10
  • 打赏
  • 举报
回复
谢谢。
陈硕 2001-12-10
  • 打赏
  • 举报
回复
你原来的程序有memory leak, 而且违反了EC中关于"不能传回私有数据的handle"的条款.

//干嘛用的?怎么使用?
C++ Primer p.772
User-Defined Conversions

strcpy(p1,"sdf"); // 在 MSVC 6 中,这里出现“写”错误
你的程序相当于:
char *p1 = "abcd";
strcpy(p1,"sdf");
这当然会“写”错误。
建议你的class string1把传进来的数据复制一份再存储,参考C++ Primer 725 730页的例子。
zhangx105 2001-12-10
  • 打赏
  • 举报
回复
Solstice:
我把构造函数改为:
string1(char * value)
{
data=new char[20];
strcpy(data,value);

}
析构改为:
~string1()
{
delete[] data;
data=NULL;
}
这时main里删掉语句delete[] p1;p1=NULL;则运行正常,加上则错
书上说传回私有指针是个错误,但为何不能delete我new的p1呢?
请指点,谢谢!

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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