实现单参数strcpy,是你会怎么做?

BeHardOnSelf 2009-03-13 10:50:26

auto_ptr<char*> strcpy1(char *s)
{
char *d=new char[(strlen(s)+1)];
char *m=d;
while((*d++=*s++)!='\0');

auto_ptr<char*> ptr(m);
cout<<"in strcpy1 "<<m<<endl;
return ptr;
}

int main(void)
{
char s[]="HEllo";
char **d;
d=strcpy1(s).get();
cout<<*d;
return 0;

}

错在哪该如何解决?有一个笔试题要求完成单参数的拷贝函数!如果是直接返回一个char*类型那么在用完这个函数后得delete
一般可能会忘记做delete,如果用auto_ptr好像又出问题,各位大侠指点一下!
...全文
212 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
BeHardOnSelf 2009-03-14
  • 打赏
  • 举报
回复
确实auto_ptr不支持delete[],包括内置类型也不行。
14楼的方法最好!
结贴
mengde007 2009-03-13
  • 打赏
  • 举报
回复
所以说参数不可用char*!
mengde007 2009-03-13
  • 打赏
  • 举报
回复
作者犯了一个重要的错误,对于auto_ptr<>调用的析构函数是delete 而非delete[],这是规定!
BeHardOnSelf 2009-03-13
  • 打赏
  • 举报
回复
auto_ptr <char*> ptr(m);
改为
auto_ptr <char*> ptr(&m);
函数里头就没问题了,不过返回主函数运行的时候又出问题了。
然后说是什么访问冲突。。。。
不过听说在改了后在dev c++下就没问题了。

BeHardOnSelf 2009-03-13
  • 打赏
  • 举报
回复
啊?!晕倒!调了N久了,没找出问题所在!
可是VS2005不是挺好的吗?
arong1234 2009-03-13
  • 打赏
  • 举报
回复
那只是调试器的问题,不代表你代码有问题
[Quote=引用 4 楼 BeHardOnSelf 的回复:]
但是我单步运行的时候函数里的ptr会提示出这个错误:
Erro::expression cannot be evaluated
我用的是VS2005
[/Quote]
BeHardOnSelf 2009-03-13
  • 打赏
  • 举报
回复
但是我单步运行的时候函数里的ptr会提示出这个错误:
Erro::expression cannot be evaluated
我用的是VS2005
  • 打赏
  • 举报
回复
是delete的但对于内置类型而言

delete和delete[]没区别.
BeHardOnSelf 2009-03-13
  • 打赏
  • 举报
回复
谢谢坏人的回答,
暂且不管函数里头应该有个assert之类的,先主要看这个主要部分
可是如果换成auto_ptr<char*> pt=strcpy1(s);也不行!
我怀疑是不是auto_ptr的空间的释放只是delete ptr,而这个需要delete[]呢?
如果是?还有什么办法解决吗?
  • 打赏
  • 举报
回复
你应该也用一个auto_ptr<char*>的指针去接收这个返回值啊
fairchild811 2009-03-13
  • 打赏
  • 举报
回复
太复杂了,感觉这样的代码还不如双参数来的简洁明了.

这样更容易出错
chin_chen 2009-03-13
  • 打赏
  • 举报
回复
函数对象,这样会好点!
#include <iostream>

using namespace std;

class my
{
public:
char *d;
public:

char*operator()(char*s)
{

d=new char[(strlen(s)+1)];
strcpy(d,s);
cout <<"in strcpy1 " <<endl<<d <<endl;
return d;

}
~my()
{
delete [] d;

}


};

int main()
{
char *str="hello";
my strcpy1;
strcpy1(str);
cout<<strcpy1.d<<endl;
system("pause");


}
BeHardOnSelf 2009-03-13
  • 打赏
  • 举报
回复
呵呵。。。。这也只是个笔试题,没有什么硬性要求,主要是实现单参数的strcpy
刚看到这题的时候,也很纳闷出题的含义。
现在想想估计就是为了考资源管理这一块吧。
此贴必结,只是本人比较贪心,想多看看各位大侠的高招。
大侠们出招吧!O(∩_∩)O哈哈~
tangshuiling 2009-03-13
  • 打赏
  • 举报
回复

个人认为操作这种纯c风格的字串最好还是不用智能指针的好,一方面有效能的考虑,另一方面语义也并不是很直观!
直接:
char* _strcpy(char *s)
{
char* temp=new [strlen(s)+1];
char* p=temp;
.....do something.....
return p;
}
然后在设计一个:
void release(void* p)
{
delete []p;
}
在设计文档中说明调用_strcpy进行字串拷贝,release函数释放资源
或干脆把这两种行为封装在一个类中

#include<iostream>
#include<string>
#include <memory>
using namespace std;
class _strcpy
{
public:
_strcpy(char *s)
{
char* temp=new char[strlen(s)+1];
ele=temp;
while((*temp++=*s++)!='\0');
}
~_strcpy()
{
delete []ele;
}
operator char*()
{
return ele;
}
private:
_strcpy(const _strcpy& rhs) //暂时没考虑对象拷贝、赋值的问题
{
}
_strcpy& operator=(const _strcpy& rhs)
{
return *this;
}
char* ele;
};


int main(void)
{
char s[]="HEllo";
cout<<_strcpy(s);
system("pause");
return 0;
}


chin_chen 2009-03-13
  • 打赏
  • 举报
回复
按照你的思路,我该了下,不过改了之后,会有个小问题,但满足你的要求。
#include <iostream>
#include <memory>
using namespace std;

auto_ptr <char*> &strcpy1(char *s) //这个地方要用引用,否则返回值拷贝的时候,把里面的对象析构了。
{
char *d=new char[(strlen(s)+1)];
char *m=d;
while((*d++=*s++)!='\0');

auto_ptr <char*> *ptr=new auto_ptr<char*>(m);//这个得自己new一个出来,不然出了函数的范围,又析构了。
cout <<"in strcpy1 " <<m <<endl;
return *ptr;
}

int main(void)
{
char s[]="HEllo";
char **d;

d=strcpy1(s).get();//这里有个毛病,就是本身这个auto_ptr<char*>,这块内存没法删除了。


system("pause");
return 0;

}
  • 打赏
  • 举报
回复
很好奇,单参数的strcpy的功能是怎样的?参数如何分配。
ltc_mouse 2009-03-13
  • 打赏
  • 举报
回复
是否应该使用auto_ptr<char> 而不是auto_ptr<char *>呢?
BeHardOnSelf 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mengde007 的回复:]
作者犯了一个重要的错误,对于auto_ptr <>调用的析构函数是delete 而非delete[],这是规定!
[/Quote]
确如坏人所说,内置类型delete[]与delete是一样的。
如果参数是char*,你会怎么做?

64,639

社区成员

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

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