我刚开始学习boost共享指针。
我写了一个简短的程序,结果看起来不错,但我不确定内存是否与我的代码解除分配。我想问一下,如果有人能查看我的代码并告诉我是否正确使用共享指针。
#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;
}
感谢您的任何建议;我希望它对我和其他人都有帮助。
答案 0 :(得分:3)
一切都没问题,但你不需要vect.clear()
字符串。但是,string
是值类型,请勿使用字符串shared_ptr
。
答案 1 :(得分:3)
在没有直接内存泄漏的意义上,您的使用是正确的。但是,您并不是真正的例外安全 - 如果random_string
抛出,您将泄漏stdstr
。完全绕过rwa指针更好(也更惯用)。以下是使用std::shared_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);
}
另外,正如@ForEveR所指出的那样,没有理由在真实世界的应用程序中动态分配std::string
。但我认为你只是用它作为智能指针的练习,当然没问题。