2

ブースト共有ポインターの学習を始めたばかりです。

短いプログラムを書きました。結果は良好に見えますが、コードでメモリが適切に解放されているかどうかはわかりません。誰かが私のコードを見て、共有ポインタを正しく使用しているかどうかを教えてください。

#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;
}

アドバイスありがとうございます。私や他の人に役立つことを願っています。

4

2 に答える 2

4

直接のメモリリークがないという意味で、あなたの使用は正しいです。ただし、実際には例外セーフではありません。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に、実際のアプリで動的に割り当てる理由はほとんどありません。ただし、スマート ポインターを使用した演習として使用することを前提としていますが、もちろん問題ありません。

于 2013-06-05T06:51:56.237 に答える
3

すべて問題ありませんが、糸を引く必要はありませんvect.clear()。ただし、string値型なので文字列は使用しないでくださいshared_ptr

于 2013-06-05T06:37:49.660 に答える