【发布时间】:2013-06-05 06:34:45
【问题描述】:
我刚开始学习提升共享指针。
我写了一个简短的程序,结果看起来不错,但我不确定我的代码是否能很好地释放内存。我想问一下,是否有人可以查看我的代码并判断我是否正确使用了共享指针。
#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;
}
感谢您的任何建议;我希望它对我和其他人有所帮助。
【问题讨论】:
-
与问题没有直接关系,但鉴于您已经拥有 C++11 支持(
auto,lambdas),您也可以使用std::shared_ptr而不是 Boost 变体。跨度> -
共享指针对我来说是新事物,所以无论如何 std 或 boost 都会很棘手。 WIN XP SP 3 及更高版本支持更多 std::shared_ptr 。这意味着,它在某些 PC 上无法运行。
-
std::unique_ptrs 在std::vector中更好。您可以将它们移动到向量中。这样做的原因是shared_ptrs 有点重。 -
std::shared_ptr是一个纯模板类,使其成为编译时构造。它需要 VS 2010 或更高版本,但它不依赖于目标系统。 -
“有人可以查看我的代码并判断我是否正确使用了共享指针。” - 不,你不是,你在使用
boost::shared_ptr<std::string>s仅使用std::string更合适的情况。请记住,shared_ptrs 并不是要替代正确的值语义,这是 C++ 而不是 Java。智能指针只有在那些考虑因素实际上存在的情况下才能让您从手动内存管理考虑中解脱出来。
标签: c++ boost shared-ptr