【问题标题】:c++ vector of boost::shared_ptrc++ boost::shared_ptr的向量
【发布时间】: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&lt;std::string&gt;s仅使用std::string 更合适的情况。请记住,shared_ptrs 并不是要替代正确的值语义,这是 C++ 而不是 Java。智能指针只有在那些考虑因素实际上存在的情况下才能让您从手动内存管理考虑中解脱出来。

标签: c++ boost shared-ptr


【解决方案1】:

从没有直接内存泄漏的意义上说,您的使用是正确的。但是,您并不是真正的异常安全 - 如果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 的理由很少。但我假设你只是将它用作智能指针的练习,这当然很好。

【讨论】:

  • 为此还需要包含
【解决方案2】:

一切都好,但你不需要vect.clear() 字符串。但是string是value-type,不要使用string的shared_ptr

【讨论】:

  • 另外我会将 random_string 的签名更改为 void randomstring(size_t length, std::string& out) 以进行内存和速度优化(当然在这个例子中它不是值得担心的事情!)
  • @Kourosh No. 查找命名返回值优化。不要这样做。
  • @Kourosh 使用 C++11 的移动语义,OP 的签名可能更可取。另外,want speed? Pass by value.
猜你喜欢
  • 2013-07-09
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-15
  • 1970-01-01
相关资源
最近更新 更多