C++ 对对象数组的访问冲突

Posted

技术标签:

【中文标题】C++ 对对象数组的访问冲突【英文标题】:C++ access violation to array of objects 【发布时间】:2012-05-28 20:50:46 【问题描述】:

我是 C++ 的新手,我尝试创建一个对象数组。我使用类似的代码

const int SORT_SIZE = 20;

int _tmain(int argc, _TCHAR* argv[])

    CSimple * data;
    data = new CSimple[SORT_SIZE];

    for(int i = 0; i < SORT_SIZE; i++)
    
/*Access violation here*/   *(data + i * (sizeof(CSimple))) = *(new CSimple(rand() % 10000));
    

在 i = 5 的循环中,我遇到了访问冲突。 sizeof(CSimple) 是 8(那里只有一个 int 字段)

【问题讨论】:

抱歉,删除我的答案 - 在重新阅读您的代码后,我所说的内容有很多错误,最好删除。 取出* (sizeof(CSimple) @PaulR 是对的。编译器负责将指针算术运算的整数操作数按指向对象的大小进行缩放,因此当您也这样做时,您将比您想象的更进一步。 哦,很抱歉@PaulR 你也回答了。一开始我只是不理解你,但现在我明白你也是对的!新手太难了:)谢谢! 【参考方案1】:

将 for 循环中的行替换为 data[i] = CSimple(rand() % 10000)。更具可读性,不是吗?

您的代码失败的原因是因为data + i 不会将数据增加 i 字节,而是增加 i CSimple's。比如说,如果 CSimple 是 4 个字节长,那么 data + i * sizeof(CSimple) 会将数据增加 16 个字节而不是 4 个。

【讨论】:

&amp;data[i],不是吗?编辑:不,内存已经分配,​​所以删除new @djechlin 编辑:看来我们都错了(同时更正了自己)。【参考方案2】:

作为新手,您为什么不让您的生活更轻松,并使用自动为您完成繁重工作的类型?

#include <vector>

const int SORT_SIZE = 20;

int _tmain(int argc, _TCHAR* argv[])

    std::vector<CSimple> data;

    for(int i = 0; i < SORT_SIZE; i++)
    
        data.push_back( CSimple(rand() % 10000) );
    

【讨论】:

以上是关于C++ 对对象数组的访问冲突的主要内容,如果未能解决你的问题,请参考以下文章

C++ 字符串向量和数组的一些术语

C++ 字符串向量和数组的一些术语

C++ 字符串向量和数组的一些术语

C++ 字符串向量和数组的一些术语

当我尝试删除数组时,C++ 访问冲突读取位置 0xDDDDDDCD 已更新

java多线程访问同一个数组,存在并发问题吗,每个线程访问的是数组的不同部分,不存在冲突