1

会社とその所有者に関する情報を保存するために使用される宿題プログラムのメモリ使用量に問題があります。クラスСompanyTemplateはこの情報を表します。

public:
CompanyTemplate (const string & oName,
                 const string & oAddr,
                 const string & cName,
                 const string & cAddr);

別のクラスCCompanyIndexは、ポインターの動的配列を使用して複数のレコードを格納するために使用されます(ベクトルの使用は許可されていません)。CCompanyIndexコンストラクターは次のとおりです。

CCompanyIndex :: CCompanyIndex (void)
{
allocated = 1000;
current_size = 0;
pole = new CompanyTemplate* [allocated];
for (int i=0; i<allocated; i++)
{
    pole[i] = NULL;
}
}

CCompanyIndexは、メソッドAdd(レコードの追加)、Del(レコードの削除)、Search(所有者の会社に関する情報の検索)も提供します。Addメソッドに問題があります。基本的なテストはすべて良好ですが、valgrindが言うように、メモリリークがあります。 、Addメソッドで。

bool CCompanyIndex :: Add( const string & oName,
                       const string & oAddr,
                       const string & cName,
                       const string & cAddr )
{

int pos = findPos(oName, oAddr);
        if(pos != -1)
        {
            return false;
        }
if ((current_size)>=allocated)
{
    CompanyTemplate ** temp;
    allocated = allocated*2+1;
    temp = new CompanyTemplate* [allocated];
    for (int i=0; i<current_size; i++)
    {
        temp[i]=pole[i];
    }
pole = temp;

for (int i=0; i<current_size; i++ )
{
    if ((pole[i])->Compare(oName,oAddr)<0)
    {
        current_size++;
        for (int k=current_size-1; k>=i; k--)
        {

        pole[i] = new Comp   pole[k+1]=pole[k];
        }anyTemplate(oName, oAddr, cName,cAddr);
        return true;
    }
}

pole[current_size] = new CompanyTemplate(oName, oAddr, cName,cAddr);
current_size++;
return true;
}

配列要素の再割り当ては期待どおりに機能します。デストラクタでエラーが発生した可能性がありますが、それでも見つかりません。ここにあります:

CCompanyIndex :: ~CCompanyIndex (void)
{
for (int i=0; i<allocated; i++)
{
    delete pole[i];
}
delete [] pole;
pole = NULL;
}

ありがとう

4

2 に答える 2

1

所有権が不明な場合は、を使用してstd::shared_ptrください。

もちろん、専門家の設定では、より良い答えは、よりよく分析し、所有権についてより良いアイデアを得るということかもしれません。たとえば、それは本当に共有されているのでしょうか。

ただし、それがない場合は、を使用してstd::shared_ptrください。


ちなみに、クラスはコピーを適切に処理できないようです。これは「三つのルール」(またはc ++ 11の場合は「三つのルール」)と呼ばれます。基本的に、デストラクタ、コピーコンストラクタ、またはコピー代入演算子のいずれかを定義する場合、コピーを適切に処理するには、3つすべてが必要になる可能性があります。

しかし、最も簡単なのは、そのような操作を定義せず、代わりに、のような標準ライブラリコンテナ、std::vectorおよびのような標準ライブラリスマートポインタを使用することstd::shared_ptrです。

poleたとえば、(配列への)生のポインタとして定義する代わりに、として定義しますstd::vector

于 2013-03-26T12:25:18.640 に答える
1

このような一般的なタイトルでは、一般的な答えは次のようになりvectorますshared_ptr

しかし、あなたの宿題は、std::vector<CompanyTemplate>「低」レベルのC ++を使用して、STLとスマートポインターを使用せずに実装することだと思いました(それ以外の場合は、c ++を使用する最良の方法です)。それで:

他のエラーがあるかもしれませんが、ここに2つあります。

CompanyTemplate ** temp;
allocated = allocated*2+1;
temp = new CompanyTemplate* [allocated];
int i=0
for (; i<current_size; i++)
{
    temp[i]=pole[i];
}
for (; i<allocated ; i++)  // you want to make NULL the new pointers
{
    temp[i]=NULL
}
delete [] pole;    // delete old array.
pole=temp;
于 2013-03-26T12:31:53.010 に答える