- 主题:今天被C++的stl vector 自动扩大空间坑了
class Item
{
public:
int * p_data;
Item(int n)
{
p_data=new int[n];
}
~Item()
{
delete [] pdata;
}
};
std::vector<Item> v;
v.emplace_back(10);
v.emplace_back(20);
类似这种,然后发现v[0]->pdata用的时候segment fault了,原来是默认的vector的capacity 是1,如果增加元素,会重新生成一个capacity是2的,然后拷贝过去,我这边没实现拷贝构造函数,默认的拷贝构造就是拷贝了p_data的值,然后析构掉了p_data,这样就segment fault了。
若问 stl里面还有这种自动resize的容器么。。。
--
FROM 61.48.14.*
带指针域默认应该实现拷贝构造
另外理论上, 最好用 unique_ptr 包起来
这个跟vector没啥关系
【 在 thinkgrass (虎儿) 的大作中提到: 】
: class Item
: {
: public:
: ...................
--
FROM 124.202.207.*
这不光是自动扩大的问题啊,vector存的东西是按拷贝语义来操作的,随用随拷,用完就丢。你这item就不是一个能安全拷贝的东西,除非你每个元素只执行放入一次的操作,其他时候都只读,这样提前分配空间才能安全。
【 在 thinkgrass 的大作中提到: 】
:
: class Item
: {
: public:
: int * p_data;
: Item(int n)
: {
: p_data=new int\[n\];
: }
: ~Item()
: {
: delete \[\] pdata;
: }
: };
: std::vector<Item> v;
: v.emplace_back(10);
: v.emplace_back(20);
: 类似这种,然后发现v\[0\]->pdata用的时候segment fault了,原来是默认的vector的capacity 是1,如果增加元素,会重新生成一个capacity是2的,然后拷贝过去,我这边没实现拷贝构造函数,默认的拷贝构造就是拷贝了p\_data的值,然后析构掉了p\_data,这样就segment fault了。
:
: 若问 stl里面还有这种自动resize的容器么。。。
:
: --
:
发自「今日水木 on 钛星」
--
修改:ble FROM 222.129.49.*
FROM 222.129.49.*
【 在 ble 的大作中提到: 】
: 这不光是自动扩大的问题啊,vector存的东西是按拷贝语义来操作的,随用随拷,用完就丢。你这item就不是一个能安全拷贝的东西,除非你每个元素只执行放入一次的操作,其他时候都只读,这样提前分配空间才能安全。
: 发自「今日水木 on 钛星」
vector可以存放move only的类的实例。 所以移动/拷贝语义两者只需要实现一个即可吧?
--
FROM 122.115.229.*
好多坑啊。。。。
【 在 thinkgrass 的大作中提到: 】
:
: class Item
: {
: public:
: int * p_data;
: Item(int n)
: {
: p_data=new int\[n\];
: }
: ~Item()
: {
: delete \[\] pdata;
: }
: };
: std::vector<Item> v;
: v.emplace_back(10);
: v.emplace_back(20);
: 类似这种,然后发现v\[0\]->pdata用的时候segment fault了,原来是默认的vector的capacity 是1,如果增加元素,会重新生成一个capacity是2的,然后拷贝过去,我这边没实现拷贝构造函数,默认的拷贝构造就是拷贝了p\_data的值,然后析构掉了p\_data,这样就segment fault了。
:
: 若问 stl里面还有这种自动resize的容器么。。。
:
: --
:
发自「今日水木 on Mi Note 3」
--
FROM 103.238.135.*
这种不写拷贝构造函数的,编译器会报warning吧?
--
FROM 171.83.8.*
自己的锅,怪C++啊
你的类 Item 有问题啊, 持有内存的必须实现拷贝构造函数啊~
把《Think in C++》在看看吧~
--
修改:siwind FROM 117.188.9.*
FROM 117.188.9.*
所以,你使用这个类的时候是打算每次都提心吊胆地避免任何拷贝?
【 在 thinkgrass (虎儿) 的大作中提到: 】
: class Item
: {
: public:
: ...................
--
FROM 182.149.109.*
vector先resize,自己控制空间大小。
《effective c++》是入门书,不过c++版本不一样带来的小区别也够坑死你的。
--
FROM 183.159.182.*
这不能怪c++吧,你这是写java方式。要不vector<vector<data>>,完全不裸处理指针,要不share ptr,用vector存带指针的数据,不合适吧
--
FROM 120.244.160.*