stl vector存放含指针的类的对象?

butterflygogogo 2010-03-31 12:42:03
class A //类A
{
.....
}
class B //类B
{
private:
A* temp;
}
现在要将要将类B的对象存放在vector中
std::vector<B> vec;
这时候肯定会出现问题 因为B中含有指针
我该怎么解决这样的问题 ? 是重写拷贝构造函数?还是使用智能指针?
如果重写拷贝构造的话 很麻烦 A中也有指针 所以要重写很多类的拷贝构造
如果用智能指针的话 自己写了一会 实现的不好 麻烦大侠们给我点思路 如何实现智能指针
...全文
825 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunm42000 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 freezezdj 的回复:]
A* temp; 这个指针的值从哪儿来?如果是在vector<B>中挨个赋值的话,没问题。
如果是new的,在B的析构delete,没问题。

我发现还有好多种情况。

A temp;
改成这样也可以呀。反正用vector都是放堆上,不会栈溢出。
[/Quote]
是的 看情况而定了 不一定就不行
linsen_519 2010-04-01
  • 打赏
  • 举报
回复
补充一下,需要将B继承与class B:public boost::enable_shared_from_this<B>

因为 shared_from_this() 这些是public boost::enable_shared_from_this里面的方法


呵呵 我只是个正在培训的中的学员,不知道自己在bullshit什么东西,见谅阿
linsen_519 2010-04-01
  • 打赏
  • 举报
回复
boost中的智能指针:好处是我们不必再操心delete的问题,会自动管控的,更不用考虑什么考贝构造的问题。
#include <boost/shared_ptr.hpp>
vector<boost::shared_ptr<B> > vec;
vec.push_back(boost::shared_ptr<B>(new B(/*看B是怎么构造的*/)));

当然,如果B中有成员函数用到this时需要将this 转化成智能指针的this
用法:#include <boost/enable_shared_from_this.hpp>
例如:原来是 B* fn3(int k){
*temp+=k;
return this;
}
改成:boost::shared_ptr<A> fn3(int k) {
*temp += k;
return shared_from_this();
}
以上是必须要做的.
yuzl32 2010-03-31
  • 打赏
  • 举报
回复
智能指针 也是要依赖你的拷贝构造函数的正确性。你要保证的是A、B要有拷贝构造函数
Proteas 2010-03-31
  • 打赏
  • 举报
回复
stl vector 与指针,可能存在一个多态方面的陷阱,用时注意下。
FingerStyle 2010-03-31
  • 打赏
  • 举报
回复
实现B的拷贝构造和重载=, 就可以了
拷贝构造和= 的时候记得new
西沟函数记得delete
nut799 2010-03-31
  • 打赏
  • 举报
回复
将类B的对象存放在vector中

需求一定要存对象?
冻结 2010-03-31
  • 打赏
  • 举报
回复
A* temp; 这个指针的值从哪儿来?如果是在vector<B>中挨个赋值的话,没问题。
如果是new的,在B的析构delete,没问题。

我发现还有好多种情况。

A temp;
改成这样也可以呀。反正用vector都是放堆上,不会栈溢出。
2010-03-31
  • 打赏
  • 举报
回复
要用 vector,需要保证拷贝构造和拷贝赋值的语义是正确的。

习惯上,写任何一个类的时候,都要明确拷贝语义(要么不允许拷贝,要么保证拷贝的正确性)。
yshuise 2010-03-31
  • 打赏
  • 举报
回复
用shared_ptr最好。
class A
{

};

class B
{
boost::shared_ptr<A> p;

};

vector<boost::shared_ptr<B>> m;
m.push_back(new B);

方便之处在于不用释放内存,而且对于耗费资源的对象,可以免拷贝,当然这是
相对于对象拷贝来说的。
butterflygogogo 2010-03-31
  • 打赏
  • 举报
回复
学习了~~~~~~~~~~~~~~~~
Jim_King_2000 2010-03-31
  • 打赏
  • 举报
回复
此外,auto_ptr不可以与标准容器一起使用。《Effective C++》和《Exceptional C++》中都有详细论述。
Jim_King_2000 2010-03-31
  • 打赏
  • 举报
回复
一般而言,这样的需求需要我们封装一个自己的vector。该vector能够自动释放内部所包含的指针。


// PointerVector.h


class B;


class PointerVector
{
public:
~PointerVector(void);
...

private:
std::vector<B *> vectorImp_;
};


// PointerVector.cpp

#include "PointerVector.h"
#include <functional>
#include <algorithm>

namespace
{
class PointerDeleter : public std::unary_function<B *, void>
{
public:
result_type operator()(argument_type pointer)
{
delete pointer;
}
};
}


PointerVector::~PointerVector(void)
{
// for each (B *pointer in vectorImp_) delete pointer
std::for_each(vectorImp_.begin(), vectorImp_.end(), PointerDeleter());
}



使用PointerDeleter的代码必须保证,插入到PointerDeleter中的B *的指针必须是使用new得到的。不可以把全局变量或者局部变量的指针插入PointerDeleter。
冻结 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zhangjian33446 的回复:]
如果用A temp;的时候 创建的时候时候是分配在堆上的 堆的大小是有限的 所以得用指针
另外如果在 用vector<B*>的时候 在存对象的时候出现了问题 我也不知道怎么回事
智能指针 怎么实现 可以给点简要的代码?以前没用过智能指针
[/Quote]

只要是对象你就得放在内存中,然后你又用一个指针指向它,很明显,你每个对象多用了4字节。
另外楼主要明白栈会溢出。堆不会。
vector<B*>处理好了可以没问题,
vector<auto_ptr<B*> >是绝对会出问题的,因为c++禁了这种用法,你试试。
turbocamel 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 csucdl 的回复:]
不建议将对象作为容器的元素, 一般都是存放对象的指针, 而且不建议智能指针和容器结合使用。 因为智能指针有引用计数的 比如bstr_t, CComPtr, 还有赋值转移拥有权的CAutoPtr。 这些情况比较复杂, 所以容器还是用裸指针简单也安全
[/Quote]
赞成,可以使用std::vector<B*>,如果一定要使用std::vector<B>,只要B有拷贝构造就可以了,对A的指针直接赋值,但是注意A对象的生成一定要new出来。当然,如果B的拷贝时深度拷贝,那么A对象可以是栈上的对象。
csucdl 2010-03-31
  • 打赏
  • 举报
回复
不建议将对象作为容器的元素, 一般都是存放对象的指针, 而且不建议智能指针和容器结合使用。 因为智能指针有引用计数的 比如bstr_t, CComPtr, 还有赋值转移拥有权的CAutoPtr。 这些情况比较复杂, 所以容器还是用裸指针简单也安全
butterflygogogo 2010-03-31
  • 打赏
  • 举报
回复
如果用A temp;的时候 创建的时候时候是分配在堆上的 堆的大小是有限的 所以得用指针
另外如果在 用vector<B*>的时候 在存对象的时候出现了问题 我也不知道怎么回事
智能指针 怎么实现 可以给点简要的代码?以前没用过智能指针
lxslove 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhangjian33446 的回复:]
class A //类A
{
.....
}
class B //类B
{
private:
A* temp;
}
现在要将要将类B的对象存放在vector中
std::vector<B> vec;
这时候肯定会出现问题 因为B中含有指针 这个其实没问题,问题不在vector,而在类B,类B如果在析构函数中释放了temp指针的话,那就什么问题也没有,vector在清除对象B时,会先调用对象B的析构函数的。
我该怎么解决这样的问题 ? 是重写拷贝构造函数?还是使用智能指针? 一般有指针的类都需要重写拷贝构造函数和赋值操作符
如果重写拷贝构造的话 很麻烦 A中也有指针 所以要重写很多类的拷贝……
[/Quote]
cattycat 2010-03-31
  • 打赏
  • 举报
回复
vector中可以存放B对象的指针。
FingerStyle 2010-03-31
  • 打赏
  • 举报
回复
如果用智能指针的话 , 可以直接用boost里的

64,654

社区成员

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

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