C++ c++;boost的向量::shared_ptr
我刚开始学习boost共享指针 我写了一个简短的程序,结果看起来不错,但我不确定我的代码是否能很好地释放内存。我想问一下,是否有人可以看看我的代码,告诉我是否正确使用了共享指针C++ c++;boost的向量::shared_ptr,c++,boost,shared-ptr,C++,Boost,Shared Ptr,我刚开始学习boost共享指针 我写了一个简短的程序,结果看起来不错,但我不确定我的代码是否能很好地释放内存。我想问一下,是否有人可以看看我的代码,告诉我是否正确使用了共享指针 #include <boost/shared_ptr.hpp> #include <iostream> #include <vector> #include <string> #define VECTSIZE 10 typedef boost::shared_ptr&l
#include <boost/shared_ptr.hpp>
#include <iostream>
#include <vector>
#include <string>
#define VECTSIZE 10
typedef boost::shared_ptr<std::string> StringPtr;
typedef std::vector<StringPtr> StringVect;
///////////////////////////////////////////////////////////////
std::string random_string (size_t length);
///////////////////////////////////////////////////////////////
int main()
{
StringVect vect;
for (int i = 0; i < VECTSIZE; i++)
{
std::string * stdstr;
stdstr = new std::string;
*stdstr = random_string(10);
std::cout << *stdstr << "\r\n";
StringPtr str(stdstr);
vect.push_back(str);
}
std::cout << "\r\n\r\n";
for (int i = 0; i < VECTSIZE; i++)
{
std::cout << *vect[i] << "\r\n";
}
vect.clear();
system("pause");
return 0;
}
///////////////////////////////////////////////////////////////
std::string random_string (size_t length)
{
auto randchar = []() -> char
{
const char charset[] =
"0123456789"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";
const size_t max_index = (sizeof(charset) - 1);
return charset[ rand() % max_index ];
};
std::string str(length,0);
std::generate_n( str.begin(), length, randchar );
return str;
}
#包括
#包括
#包括
#包括
#定义向量大小10
typedef boost::shared_ptr StringPtr;
typedef std::vector StringVect;
///////////////////////////////////////////////////////////////
标准::字符串随机字符串(大小和长度);
///////////////////////////////////////////////////////////////
int main()
{
StringVect-vect;
对于(int i=0;i std::cout一切正常,但您不需要vect.clear()
string。但是,string
是值类型,不要使用字符串的shared_ptr
。您的使用在没有直接内存泄漏的意义上是正确的。但是,您并不是真正的异常安全-如果随机_string
抛出,您将泄漏stdstr
。这样更好(更惯用)完全绕过rwa指针。下面是使用std::shared\u ptr
的示例:
for (int i = 0; i < VECTSIZE; i++)
{
StringPtr str = std::make_shared<std::string>(); // Encapsulates new
*str = random_string(10);
std::cout << *str << '\n'; //No \r here: text streams insert it on Windows automatically
vect.push_back(str);
}
for(int i=0;i std::可能与问题没有直接关系,但考虑到您已经获得了C++11支持(auto
,lambdas),您也可以使用std::shared_ptr
而不是Boost变体。共享指针对我来说是新事物,所以无论如何std或Boost都会很棘手。更重要的是,std::shared_ptr在WIN XP SP 3和后者上受支持。这意味着,它在某些PC上不起作用。更好的是std::unique_ptr
s在std::vector
中您可以将它们移动到向量中。原因是shared_ptr
s有点重。std::shared_ptr
是一个纯模板类,使其成为编译时构造。它需要VS 2010或更高版本,但不依赖于目标系统。“有人可以查看我的代码并判断我是否正确使用了共享指针。”不,你不是,你使用的是代码> > Boo::SyddypTrp/代码> s,在一个仅仅是<代码> STD::Stry更合适的地方。记住, SyddypTr> /Cult> s不意味着是正确的语义语义的替代,这是C++和java。除此之外,降额实际上是存在的。另外,我会将random_string的签名更改为void randomstring(size_t length,std::string&out),以优化内存和速度(当然,在本例中,这不需要担心!)@Kourosh No.查找命名返回值优化。不要这样做。@Kourosh使用C++11的移动语义,OP的签名可能更可取。此外,为此还需要包括