vector 与 智能指针使用注意事项 您所在的位置:网站首页 智能指针类型有哪些图片 vector 与 智能指针使用注意事项

vector 与 智能指针使用注意事项

2024-07-15 01:51| 来源: 网络整理| 查看: 265

        看以下代码,执行时会有什么问题?

#include #include #include #include class SimpleTest { public: SimpleTest(int test_id): mId(test_id) {} ~SimpleTest() {} void print() { printf("mId = %d\n", mId); } private: int mId; }; void Test() { std::vector< std::shared_ptr > vc; vc.push_back(std::shared_ptr(new SimpleTest(5))); vc.push_back(std::shared_ptr(new SimpleTest(6))); vc.push_back(std::shared_ptr(new SimpleTest(7))); printf("vc size = %lu\n", vc.size()); for (std::vector< std::shared_ptr >::iterator iter = vc.begin(); iter != vc.end(); iter++) { (*iter)->print(); } printf("after resize\n"); vc.resize(5); for (std::vector< std::shared_ptr >::iterator iter = vc.begin(); iter != vc.end(); iter++) { (*iter)->print(); } } int main() { Test(); return 0; }

执行结果出现段错误:

 那为什么会出现段错误呢?我们可以GDB跟踪一下:

 很明显在调用了 vc.resize(5); 后,vc容器元素个数为 5 个,但其中有两个是空的。因为如果n大于当前容器的大小,则在末尾插入尽可能多的元素,使容器的大小达到 n。而插入的新元素,会调用元素的默认构造函数,而智能指针默认是构造一个空的智能指针,所以后两个是 0x0。然后再调用的话就会出现问题。所以我们在改变容器大小后,指针的调用时刻需要判断是否为空指针:

#include #include #include #include class SimpleTest { public: SimpleTest(int test_id): mId(test_id) {} ~SimpleTest() {} void print() { printf("mId = %d\n", mId); } private: int mId; }; void Test() { std::vector< std::shared_ptr > vc; vc.push_back(std::shared_ptr(new SimpleTest(5))); vc.push_back(std::shared_ptr(new SimpleTest(6))); vc.push_back(std::shared_ptr(new SimpleTest(7))); printf("vc size = %lu\n", vc.size()); for (std::vector< std::shared_ptr >::iterator iter = vc.begin(); iter != vc.end(); iter++) { if(*iter != nullptr) { (*iter)->print(); } } printf("after resize\n"); vc.resize(5); for (std::vector< std::shared_ptr >::iterator iter = vc.begin(); iter != vc.end(); iter++) { if(*iter != nullptr) { (*iter)->print(); } } } int main() { Test(); return 0; }

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有