繁体   English   中英

如何使用包含指向对象的指针的动态数组来避免程序中的内存泄漏?

[英]How to avoid memory leaks in program with dynamical array containing pointers to objects?

我在家庭作业程序中无法使用内存,该程序用于存储有关公司及其所有者的信息。 С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;
}

谢谢

如果所有权不清楚,则使用std::shared_ptr

当然,在专业环境中,更好的答案可能是分析得更好,更好地了解所有权,例如,它是否真的可以共享?

但如果没有,请使用std::shared_ptr


顺便说一句,看来您的课程无法正确处理复制 这称为“三个规则”(对于c ++ 11,则称为“五个规则”)。 本质上,如果您定义析构函数,复制构造函数或复制赋值运算符中的任一个,则很可能需要同时使用这三个函数才能正确处理复制。

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

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

有了这样的通用标题,通用答案将是:使用shared_ptrvector

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

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

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM