allocator的destroy操作失败

dxgzg 2020-03-09 11:31:34
allocator<int>alloc;
auto p = alloc.allocate(10);
auto q = p;
alloc.construct(q++, 120);
alloc.construct(q++, 220);

for (auto free = q; free != p;) {
alloc.destroy(--free);
}
alloc.construct(q++, 66);
cout << q - p;

alloc.deallocate(p, 10);

为什么for循环里的destroy失败,cout<<p-q输出3而不是1。
...全文
379 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
dxgzg 2020-03-11
  • 打赏
  • 举报
回复
引用 42 楼 luj_1768 的回复:
首先,指针分配和释放是个消耗比较大的操作,通常不支持一条一条的操作,一般都是一次操作完成;对于可能增长的指针,一般会预留一些空间,也就是realloc()的理解,许多人知道的可能都是错的。其次,指针赋值,通常在系统只是标记一个操作量,而没有内存分配、拷贝操作,这一点许多人的概念也是错误的。一般情况下,比较长的内存操作都要使用专用函数一步一步地操作,而不能使用简单的赋值操作。
哦哦,我看明白了,谢谢大佬了!
luj_1768 2020-03-11
  • 打赏
  • 举报
回复
首先,指针分配和释放是个消耗比较大的操作,通常不支持一条一条的操作,一般都是一次操作完成;对于可能增长的指针,一般会预留一些空间,也就是realloc()的理解,许多人知道的可能都是错的。其次,指针赋值,通常在系统只是标记一个操作量,而没有内存分配、拷贝操作,这一点许多人的概念也是错误的。一般情况下,比较长的内存操作都要使用专用函数一步一步地操作,而不能使用简单的赋值操作。
coo135 2020-03-10
  • 打赏
  • 举报
回复
引用 38 楼 dxgzg 的回复:
引用 36 楼 coo135 的回复:
我不是很明白你的问题,1楼的代码显然没有问题,能够正常工作;7楼的写的略差~,但也能正常工作。是不是指 7楼的91行 alloc.destroy(--q); 改成 alloc.destroy(--free);就出错了?
是的,就是这个意思,书上也是不加引用也能运行


7楼第90行 for (auto free=q; free!=p; --free)
如果你用alloc.destroy(--free),那减了2次了,越界了,当然会出错了。

这个--free画蛇添足了~~
dxgzg 2020-03-10
  • 打赏
  • 举报
回复
引用 37 楼 lin5161678 的回复:
[quote=引用 35 楼 dxgzg的回复:][quote=引用 33 楼 lin5161678 的回复:][quote=引用 32 楼 dxgzg 的回复:] 是的,我的问题就是书上也是destroy(—free)就成功了,我知道两次写的不是一样,就是这一个问题没懂
从头到尾都是成功 根本不存在 destroy 失败这个情况 区别只是 有没有修改变量 q 把有没有修改变量q 当成destroy有没有成功 是一个匪夷所思的想法[/quote]你看书上的for循环也是不加&的,递减就没有问题,我这里就有问题,我不懂来问有啥问题嘛?[/quote] 不懂问没什么问题 三个人告诉你五次还不懂 就很大问题 [/quote]好,我笨我菜咯,满意了吗?你要是没事干自己去找点事干,OK?
dxgzg 2020-03-10
  • 打赏
  • 举报
回复
引用 36 楼 coo135 的回复:
我不是很明白你的问题,1楼的代码显然没有问题,能够正常工作;7楼的写的略差~,但也能正常工作。是不是指 7楼的91行 alloc.destroy(--q); 改成 alloc.destroy(--free);就出错了?
是的,就是这个意思,书上也是不加引用也能运行
lin5161678 2020-03-10
  • 打赏
  • 举报
回复
引用 35 楼 dxgzg的回复:
[quote=引用 33 楼 lin5161678 的回复:][quote=引用 32 楼 dxgzg 的回复:] 是的,我的问题就是书上也是destroy(—free)就成功了,我知道两次写的不是一样,就是这一个问题没懂
从头到尾都是成功 根本不存在 destroy 失败这个情况 区别只是 有没有修改变量 q 把有没有修改变量q 当成destroy有没有成功 是一个匪夷所思的想法[/quote]你看书上的for循环也是不加&的,递减就没有问题,我这里就有问题,我不懂来问有啥问题嘛?[/quote] 不懂问没什么问题 三个人告诉你五次还不懂 就很大问题
coo135 2020-03-10
  • 打赏
  • 举报
回复
我不是很明白你的问题,1楼的代码显然没有问题,能够正常工作;7楼的写的略差~,但也能正常工作。是不是指 7楼的91行 alloc.destroy(--q); 改成 alloc.destroy(--free);就出错了?
dxgzg 2020-03-10
  • 打赏
  • 举报
回复
引用 33 楼 lin5161678 的回复:
[quote=引用 32 楼 dxgzg 的回复:] 是的,我的问题就是书上也是destroy(—free)就成功了,我知道两次写的不是一样,就是这一个问题没懂
从头到尾都是成功 根本不存在 destroy 失败这个情况 区别只是 有没有修改变量 q 把有没有修改变量q 当成destroy有没有成功 是一个匪夷所思的想法[/quote]你看书上的for循环也是不加&的,递减就没有问题,我这里就有问题,我不懂来问有啥问题嘛?
dxgzg 2020-03-10
  • 打赏
  • 举报
回复
lin5161678 2020-03-10
  • 打赏
  • 举报
回复
引用 32 楼 dxgzg 的回复:
是的,我的问题就是书上也是destroy(—free)就成功了,我知道两次写的不是一样,就是这一个问题没懂
从头到尾都是成功 根本不存在 destroy 失败这个情况 区别只是 有没有修改变量 q 把有没有修改变量q 当成destroy有没有成功 是一个匪夷所思的想法
dxgzg 2020-03-10
  • 打赏
  • 举报
回复
引用 30 楼 coo135 的回复:
引用 21 楼 dxgzg 的回复:
引用 19 楼 lin5161678 的回复:
引用 17 楼 dxgzg 的回复:
[quote=引用 15 楼 真相重于对错 的回复:]一样的。。。。。,建议学习一下计算机基础知识。否则就是盲人摸象。
我又没觉得自己厉害,菜就是菜,你自己destroy都不知道能递减就非要来指责我告别这个行业,我想做人要学会谦虚吧
告诉你 destroy代码都贴出来了 还嘴硬? 水平低 脾气倒不小
是我先说的??你自己看看好吗,上来说告别这个行业最后成了我的错咯?


要耐心、仔细~~~
你在1楼的代码:for (auto free = q; free != p;) alloc.destroy(--free); --的是free,没有改变q的值,所以减出来是3,正确。
7楼的代码是:for (auto free = q; free != p;) alloc.destroy(--q); --的是q了,所以自然是1了~~~

结论就是这不是bug~~~是你写错了~~
标准库质量很高的,不会有这种低级BUG的~~细心!细心!细心![/quote]是的,我的问题就是书上也是destroy(—free)就成功了,我知道两次写的不是一样,就是这一个问题没懂
dxgzg 2020-03-10
  • 打赏
  • 举报
回复
引用 29 楼 lin5161678 的回复:
以你的智商和理解能力 高别这个行业是一个性价比较高的选择
好勒,咱们十年后见
coo135 2020-03-10
  • 打赏
  • 举报
回复
引用 21 楼 dxgzg 的回复:
引用 19 楼 lin5161678 的回复:
引用 17 楼 dxgzg 的回复:
引用 15 楼 真相重于对错 的回复:
一样的。。。。。,建议学习一下计算机基础知识。否则就是盲人摸象。
我又没觉得自己厉害,菜就是菜,你自己destroy都不知道能递减就非要来指责我告别这个行业,我想做人要学会谦虚吧
告诉你 destroy代码都贴出来了 还嘴硬? 水平低 脾气倒不小
是我先说的??你自己看看好吗,上来说告别这个行业最后成了我的错咯?


要耐心、仔细~~~
你在1楼的代码:for (auto free = q; free != p;) alloc.destroy(--free); --的是free,没有改变q的值,所以减出来是3,正确。
7楼的代码是:for (auto free = q; free != p;) alloc.destroy(--q); --的是q了,所以自然是1了~~~

结论就是这不是bug~~~是你写错了~~
标准库质量很高的,不会有这种低级BUG的~~细心!细心!细心!
lin5161678 2020-03-10
  • 打赏
  • 举报
回复
以你的智商和理解能力 高别这个行业是一个性价比较高的选择
lin5161678 2020-03-10
  • 打赏
  • 举报
回复
引用 26 楼 dxgzg 的回复:
先谢谢你,你先别笑死,你说destroy没用,那这个函数干嘛要设计出来
语无伦次 destroy根本不存在递减 是怎么理解出 destroy没用的? 谁告诉你 destroy是递减用的
真相重于对错 2020-03-10
  • 打赏
  • 举报
回复
请不要断章取义,我说的,告别这个行业是有前提的,如果一个人连打字都不知道打的是什么,还能编程吗?
dxgzg 2020-03-10
  • 打赏
  • 举报
回复
引用 19 楼 lin5161678 的回复:
引用 17 楼 dxgzg 的回复:
引用 15 楼 真相重于对错 的回复:
一样的。。。。。,建议学习一下计算机基础知识。否则就是盲人摸象。
我又没觉得自己厉害,菜就是菜,你自己destroy都不知道能递减就非要来指责我告别这个行业,我想做人要学会谦虚吧
告诉你 destroy代码都贴出来了 还嘴硬? 水平低 脾气倒不小
先谢谢你,你先别笑死,你说destroy没用,那这个函数干嘛要设计出来
dxgzg 2020-03-10
  • 打赏
  • 举报
回复
引用 22 楼 lin5161678 的回复:
[quote=引用 20 楼 dxgzg 的回复:] 那你厉害,告诉我怎么解决,他先说我告别这个行业的OK?水军吗?
的确比你厉害 解决方法多得是 但我懒得教你 答案 真相重于对错 全部都说了 看不懂是你自己的问题 [/quote]你们厉害,问个问题,让我告别这个行业,最后的问题还是我身上,真棒👍给你点个赞
lin5161678 2020-03-10
  • 打赏
  • 举报
回复
引用 20 楼 dxgzg 的回复:
引用 19 楼 lin5161678 的回复:
引用 17 楼 dxgzg 的回复:
引用 15 楼 真相重于对错 的回复:
一样的。。。。。,建议学习一下计算机基础知识。否则就是盲人摸象。
我又没觉得自己厉害,菜就是菜,你自己destroy都不知道能递减就非要来指责我告别这个行业,我想做人要学会谦虚吧
告诉你 destroy代码都贴出来了 还嘴硬? 水平低 脾气倒不小
那你厉害,告诉我怎么解决,他先说我告别这个行业的OK?水军吗?
随口说一个解决方式 省得你以为真没人懂 auto free 改成 auto& free 完事 顺便强调一下 destroy根本不存在递减 递减是 --运算符的效果 有没有 destroy根本没关系 张冠李戴 还以为掌握真理 笑死人
dxgzg 2020-03-10
  • 打赏
  • 举报
回复
引用 22 楼 lin5161678 的回复:
[quote=引用 20 楼 dxgzg 的回复:] 那你厉害,告诉我怎么解决,他先说我告别这个行业的OK?水军吗?
的确比你厉害 解决方法多得是 但我懒得教你 答案 真相重于对错 全部都说了 看不懂是你自己的问题 [/quote]是哦,你最厉害,行不,我就是菜鸡我哪里不承认了?
加载更多回复(22)

64,646

社区成员

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

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