看以下代码,执行时会有什么问题?
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <memory>
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<SimpleTest> > vc;
vc.push_back(std::shared_ptr<SimpleTest>(new SimpleTest(5)));
vc.push_back(std::shared_ptr<SimpleTest>(new SimpleTest(6)));
vc.push_back(std::shared_ptr<SimpleTest>(new SimpleTest(7)));
printf("vc size = %lu\n", vc.size());
for (std::vector< std::shared_ptr<SimpleTest> >::iterator iter = vc.begin(); iter != vc.end(); iter++)
{
(*iter)->print();
}
printf("after resize\n");
vc.resize(5);
for (std::vector< std::shared_ptr<SimpleTest> >::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 <vector>
#include <stdio.h>
#include <stdlib.h>
#include <memory>
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<SimpleTest> > vc;
vc.push_back(std::shared_ptr<SimpleTest>(new SimpleTest(5)));
vc.push_back(std::shared_ptr<SimpleTest>(new SimpleTest(6)));
vc.push_back(std::shared_ptr<SimpleTest>(new SimpleTest(7)));
printf("vc size = %lu\n", vc.size());
for (std::vector< std::shared_ptr<SimpleTest> >::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<SimpleTest> >::iterator iter = vc.begin(); iter != vc.end(); iter++)
{
if(*iter != nullptr)
{
(*iter)->print();
}
}
}
int main()
{
Test();
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)