【问题标题】:Accessing individual objects created by "new", through pointer arithmetic通过指针算法访问由“new”创建的单个对象
【发布时间】:2014-04-13 18:56:44
【问题描述】:

我正在动态创建 MyClass 的 3 个对象。

MyClass *ptr = new MyClass[3];

我假设 ptr 是所述对象的第一个实例的地址。我可以的

(*ptr).doStuff();

但是,当我尝试访问第二个对象时,通过

(* (ptr + sizeof(MyClass)) ).doStuff();

它抛出一个异常。我应该如何获得其他对象?

【问题讨论】:

  • ptr[0],ptr[1],ptr[2]

标签: c++ pointers


【解决方案1】:

以下是选项(从最推荐到最不推荐):

ptr[1].doStuff();
(ptr+1)->doStuff();
(*(ptr+1)).doStuff();
((MyClass*)((char*)ptr+sizeof(MyClass)))->doStuff();
(*(MyClass*)((char*)ptr+sizeof(MyClass))).doStuff();

【讨论】:

  • @Lightness Races in Orbit:你认为我还应该去哪里?
  • 当然要深入到语言的黑暗深处!
  • @Lightness Races in Orbit:哈哈,好一个。但我现在看不到更多我可以添加的内容,除了将 char* 更改为 int 和那种东西(顺便说一句,这不是很安全)......
  • @Lightness Races in Orbit:你为什么顺便编辑帖子?
  • @Lightness Races in Orbit:哦……好吧,我没有拒绝它或任何东西,只是没有看到任何改变……你还有什么想法?跨度>
【解决方案2】:

有效代码如下所示

(* (ptr + 1) ).doStuff();

这就是所谓的指针运算。您将指针“移动”到您想要的元素数量。

【讨论】:

    【解决方案3】:

    这是因为将 ptr 递增 1 并不是简单地将指针递增 1 个字节。相反,它将指针移动到指向数组的下一个元素。而不是你的最后一行,你必须写

    (* (ptr + 1) ).doStuff();
    

    或:

    (ptr+1)->doStuff();
    

    或者,正如评论者所建议的那样,更具可读性:

    ptr[1]->doStuff();
    

    【讨论】:

      【解决方案4】:

      指针算法已经考虑了指针类型的大小。所以你应该加上1,而不是sizeof(MyClass)

      否则你就过分了。

      【讨论】:

        猜你喜欢
        • 2014-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-28
        • 2021-04-25
        • 1970-01-01
        相关资源
        最近更新 更多