Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;boost的向量::shared_ptr_C++_Boost_Shared Ptr - Fatal编程技术网

C++ c++;boost的向量::shared_ptr

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

我刚开始学习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;
}
#包括
#包括
#包括
#包括
#定义向量大小10
typedef boost::shared_ptr StringPtr;
typedef std::vector StringVect;
///////////////////////////////////////////////////////////////
标准::字符串随机字符串(大小和长度);
///////////////////////////////////////////////////////////////
int main()
{
StringVect-vect;
对于(int i=0;istd::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;istd::可能与问题没有直接关系,但考虑到您已经获得了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的签名可能更可取。此外,为此还需要包括