拷贝构造函数

wolibaba 2010-04-14 12:48:17
template<T>
class Array {

puclic:
Array(const Array& anotherArray) {

delete[] storage; // 释放旧的内存
// 重新分配内存,并拷贝内容
}
T operator[](int index) { return storage[index] }

private:
T *storage;
};

(1)operator[] 为什么会调用Array 的拷贝构造函数?
(2)为什么执行一次拷贝构造可以,而多次不行呢?
即将operator[]的实现改为:
T result = storage[index] // ok,调用了一次Array的拷贝构造函数
return result;// 这句执行到delete[] storage;这句的时候出错;

vs2005给出的错误信息是(运行时错误):
“0x 00413da4” 指令引用的“0xccccccc8”内存。该内存不能为“read”
...全文
182 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengzhixi 2010-04-14
  • 打赏
  • 举报
回复
Array(const Array<T>& anotherArray)
pengzhixi 2010-04-14
  • 打赏
  • 举报
回复
拷贝构造函数里面无需 delete[] storage;
wolibaba 2010-04-14
  • 打赏
  • 举报
回复
我知道为什么会错了,但是为什么会调用
Array的拷贝构造呢?
jamseyang 2010-04-14
  • 打赏
  • 举报
回复
接分!
wade_2003 2010-04-14
  • 打赏
  • 举报
回复
就是不需要释放旧对象了吧?
走好每一步 2010-04-14
  • 打赏
  • 举报
回复
呵呵,楼主的错误我曾犯过,拷贝构造,它都叫构造了,怎么还有旧对象呢
白云飘飘飘 2010-04-14
  • 打赏
  • 举报
回复
复制构造函数是用现有的对象制造出一个新的对象。并没有旧对象的存在,storage;指针是一个随机值
  • 打赏
  • 举报
回复
代码没贴全,但问题可以知道了,你是在构造函数中用到了return
记住,构造函数是能用return的
Array(const Array<T>& anotherArray) {

delete[] storage; // 释放旧的内存
storage = new T[sizeof(anotherArray)]; // 重新分配内存,并拷贝内容
memcpy(............)
}
用这种方式可能会好一点

65,189

社区成员

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

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