boost::shared_ptr 的 C++ vector

标签 c++ boost shared-ptr

我刚开始学习 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;
}

感谢您的建议;我希望它对我和其他人有所帮助。

最佳答案

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

关于boost::shared_ptr 的 C++ vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16933084/

相关文章:

c++ - 不需要大量库的体面的 shared_ptr 实现?

c++ - 成员函数的正确函数签名模板

c++ - 运行时检查失败 #2 - 变量 'projectAverage' 周围的堆栈已损坏

c++ - 使用 boost multi_index_container 来保留插入顺序

c++ - 在 boost iostream filtering_ostream 中,sync()、strict_sync() 和 flush() 有什么区别?

c++ - 使用 boost 正则表达式时出现 shared_ptr 错误

c++ - 如何计算三角数生成的运行时复杂度

c++ - 使用 Catch2Farmework 测试我的功能时出现问题

c++ - 在 Boost.Asio 请求期间检测中止的连接

c++ - Boost智能指针设计问题