1

をに挿入できないことが示されました。std::stringboost::lockfree::queue

boost::lockfree::queue放棄するには価値がありすぎるので、非常に大きな固定長の s を使用して要件charに従ってデータを渡すことができると思います(これらの要件を満たす方法を学ぶのに苦労しているので、それさえ満たすと仮定します)。大きなメッセージが必要な場合は、メモリを増やしてください。

コピー コンストラクター、自明な代入演算子、および自明なデストラクタを持つ動的サイズのテキスト オブジェクトは存在しますか? もしそうなら、どこですか?そうでない場合は、マニフェストの方法を概説してください。

4

2 に答える 2

1

コピー コンストラクター、自明な代入演算子、および自明なデストラクタを持つ動的サイズのテキスト オブジェクトは存在しますか?

動的サイズ、いいえ。何かが自明なデストラクタを持つには、オブジェクトのデストラクタが暗黙的 (またはデフォルト) であり、非静的メンバー オブジェクトにも暗黙的 (またはデフォルト) デストラクタがあることが必要です。動的に割り当てられるものはすべてdelete []、デストラクタの行に沿ったどこかを必要とするため、この制約を満たすことはできません。

上記を拡張するために、で何が起こるかの(非常に削減された)例を考えてみましょうstd::string

namespace std
{
    // Ignoring templates and std::basic_string for simplicity
    class string 
    {
    private:
        char* internal_;
        // Other fields

    public:
        string(const char* str)
          : internal_(new char[strlen(str) + 1])
        { }

    };
}

デストラクタをデフォルトのままにしておくとどうなるかを考えてみましょう: スタックに割り当てられたchar *もの (つまり、ポインターが指すものではなく、ポインター自体)破壊されます。これにより、メモリ リークが発生する可能性があります。これは、参照がなく解放できない領域が割り当てられているためです。したがって、デストラクタを宣言する必要があります。

~string()
{
    delete[] internal_;
}

ただし、これを行うと、デストラクタはユーザー定義になり、自明ではなくなります。

これは、動的に割り当てられるものすべてで問題になります。shared_ptraや a のようなものvector<char>をメンバー変数として使用しても、これを修正できないことに注意してください。それらは私たちのクラスでスタックに割り当てられているかもしれませんが、その下では単にメモリ管理を処理しているだけnew []ですdelete [].

これを満たすには、スタック割り当てchar配列を使用する必要があります。つまり、動的割り当てがないため、固定サイズになります。

于 2013-09-10T03:30:16.383 に答える
1

自明なコピー ctor/dtor を持つ動的サイズ型は使用できません。問題には 2 つの解決策があります。固定サイズの型を使用するか、ポインターをキューに格納します。

boost::lockfree::queue<std::string*> queue(some_size);
// push on via new
queue.push(new std::string("blah"));
// pop and delete
std::string* ptr;
if(queue.pop(ptr))
{
   delete ptr;
}
于 2013-09-10T03:42:33.717 に答える