gpt4 book ai didi

c++ - 删除和替换 CAtlArray 中间的对象指针

转载 作者:可可西里 更新时间:2023-11-01 11:53:11 35 4
gpt4 key购买 nike

我有一个 CAtlArray,它保存像

这样定义的对象指针
CAtlArray<MyClass*> objPtrArray;

在某些情况下需要更新对象而不是复制成员,我宁愿只更新指针。基本上,这发生在更新中:

objPtryArray.SetAt( i, newObj );

我的第一个问题是我是否需要删除曾经存在于 i 中的指针(是的,它是用 new 分配的)?我的直觉告诉我是的,但是当我尝试这样做时程序崩溃了。我尝试了以下多种变体:

delete objPtrArray[i];
objPtrArray.SetAt( i, newObj );

另一个尝试是:

MyClass *tmpObj;
tmpObj = objPtrArray[i];
objPtrArray.SetAt( i, newObj );
delete tmpObj;

有什么想法吗?

提前致谢!

编辑:我应该澄清一下。该程序实际上并没有在指针替换时崩溃。如果我不删除旧指针,那很好,对象会更新。但是,如果我删除旧指针,我会得到奇怪的行为。例如,对象的一个​​成员字符数组可能会从“Hello”变成一个奇怪的字符,如“Ä”。该程序通常会在几分钟后崩溃。

此外,实际上有多个相同对象指针的 CAtlArray - 一个是主数据数组,其他用于虚拟 ListView 。我也使用 SetAt 更新虚拟列表数组。

更新:

好的,这个问题确实与 CAtlArray 无关。我试图更新的指针之一实际上是指向不同数组中的旧指针(以管理虚拟 ListView ),所以这是问题的根源。因此,删除旧指针实际上也会删除新指针。我犯了一个愚蠢的错误。

最佳答案

CAtlArray 是一些东西的数组。这个容器从不分析对象的类型,所以如果你用一个指针替换另一个指针,它不应该释放内存。您可以在它的源代码中找到它:

inline void CAtlArray< E, ETraits >::SetAt( size_t iElement, INARGTYPE element )
{
ATLASSERT( iElement < m_nSize );
m_pData[iElement] = element;
}

即,如果您将此容器用于指针,则必须删除替换的对象。

所以,奇怪的是,您遇到了这次崩溃。您确定问题不在 objPtrArray[i] 行中(可能是 i 超出范围)?最好尝试调试此错误,因为您可以轻松地重现它。请告诉我们,崩溃的原因是什么。

关于c++ - 删除和替换 CAtlArray 中间的对象指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24422222/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com