gpt4 book ai didi

c++ - 使用 SetCount 的 CAtlArray 奇怪行为

转载 作者:行者123 更新时间:2023-11-28 06:48:26 33 4
gpt4 key购买 nike

我在使用 CAtlArray 时遇到了一个奇怪的问题。如果我使用 Add 函数将元素添加到数组,它会按预期工作。但是,如果我在添加任何元素之前使用 SetCount,程序就会崩溃。奇怪的是,它只有在我直接使用 [] 运算符添加元素时才有效(我知道我知道,文档说只使用 [] 来获取元素,而不是设置元素)。我一直在检查 SetCount 是否返回 true,它确实返回了。不幸的是,我无法轻易获得很多调试信息,因为这是一个 Hook 另一个进程的 dll。我只能通过打印来调试...

我想知道这是否是典型行为/我是否遗漏了什么(文档很烂,谷歌没有返回任何有用的结果,而且 ATL 代码对我来说很难阅读/遵循)。我的第一个想法是 SetCount(X) 可能有一些行为,例如调用 Add() X 次,除非它正在扩展数组,否则不应调用,但 SetAt 也不能​​与 SetCount 一起使用。

关于这里可能发生的事情有什么想法吗?

编辑:

CAtlArray<MyClass*> arr;

...

size_t initialCount = 10;

if ( arr.SetCount(initialCount) ) {
for ( int i = 0; i < initialCount; i++ ) {
//arr.Add( new MyClass );//Does NOT work
//arr.SetAt( i, new MyClass );//Does NOT work
arr[i] = new MyClass;//This works
}
}

编辑 2:

忘了说了,我也试过使用GetData方法,但也没用:

MyClass **pData;

if ( arr.SetCount(initialCount) ) {
pData = arr.GetData();
for ( int i = 0; i < initialCount; i++, pData++ ) {
*pData = new MyClass;
}
}

最佳答案

添加元素的所有三种尝试都有效,但它们做的事情并不完全相同,而且 - 更重要的是 - 危险的选项不会使应用程序崩溃,只会创建导致稍后崩溃的条件。

//arr.Add( new MyClass );//Does NOT work
//arr.SetAt( i, new MyClass );//Does NOT work
arr[i] = new MyClass;//This works

让我们看看他们实际做了什么:

  • SetCount 向数组添加 10 个 NULL 元素
    1. Add 之后保留这 10 个空值并将您的实例添加为第 11、12 等
    2. 以下 SetAtNULL 替换为您的实例
    3. 以下索引集将 NULL 替换为您的实例,方式与上面的 #2 相同

因此项目 #2 和 #3 做“工作”,而项目 #1 做不同的事情:数组有 20 个项目,如果您稍后尝试访问这些元素,您会点击 NULL,其中你希望有有效的指针。

看看打印元素计数的小应用程序(您可以看到您有 10 或 20 个元素),然后进行元素检查以验证数组的所有元素是否“有效”。

#include "stdafx.h"
#include <atlcoll.h>

class MyClass
{
private:
INT m_nValue;

public:
MyClass() :
m_nValue(0xDEADC0DE)
{
}
VOID Check()
{
ATLASSERT(m_nValue == 0xDEADC0DE);
}
};

int _tmain(int argc, _TCHAR* argv[])
{
CAtlArray<MyClass*> arr;
size_t initialCount = 10;
if(arr.SetCount(initialCount))
{
for( int i = 0; i < initialCount; i++ )
{
arr.Add( new MyClass );//Does NOT work
//arr.SetAt( i, new MyClass );//Does NOT work
//arr[i] = new MyClass; //This works
}
}
_tprintf(_T("arr.GetCount() %d\n"), arr.GetCount());
for(SIZE_T nIndex = 0; nIndex < arr.GetCount(); nIndex++)
arr[nIndex]->Check();
return 0;
}

将元素放入数组的更简单方法如下:

    size_t initialCount = 10;    
//if(arr.SetCount(initialCount)) -- not needed
{
for( int i = 0; i < initialCount; i++ )
{
arr.Add( new MyClass );
}
}

关于c++ - 使用 SetCount 的 CAtlArray 奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24500680/

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