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,称为“五规则”)。本质上,如果您定义析构函数、复制构造函数或复制赋值运算符中的任何一个,那么您很可能需要所有三个才能正确处理复制。

但最简单的是不定义此类操作,而是使用标准库容器,如std::vector,和标准库智能指针,如std::shared_ptr.

例如,不是将其定义pole为原始指针(指向数组),而是将其定义为std::vector.

于 2013-03-26T12:25:18.640 回答
1

有了这样一个笼统的标题,笼统的答案就是:使用 a vectorof shared_ptr

但我假设你的作业是实现一种std::vector<CompanyTemplate>使用“低”级 C++、没有 STL 和智能指针的方法(否则是使用 C++ 的最佳方式)。所以:

也许您还有其他错误,但这里有两个:

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 回答