我在我的家庭作业计划中遇到内存使用问题,该程序用于存储有关公司及其所有者的信息。类С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方法时遇到了麻烦,虽然所有基本测试都很好,但我有内存泄漏,正如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;
}
由于
答案 0 :(得分:1)
如果所有权不明确,请使用std::shared_ptr
。
当然,在专业环境中,更好的答案可能是更好地分析并更好地了解所有权,例如,它真的是共享的吗?
但如果没有,请使用std::shared_ptr
。
但最简单的方法是不定义此类操作,而是使用标准库容器(如std::vector
)和标准库智能指针(如std::shared_ptr
)。
e.g。而不是将pole
定义为原始指针(到数组),而是将其定义为std::vector
。
答案 1 :(得分:1)
通过这样的通用标题,一般答案将是:使用vector
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;