固定空数组

发布于 2024-10-28 00:19:07 字数 501 浏览 1 评论 0原文

在 C++/CLI 中,是否可以固定不包含元素的数组?

例如,

array<System::Byte>^ bytes = gcnew array<System::Byte>(0);
pin_ptr<System::Byte> pin = &bytes[0]; //<-- IndexOutOfRangeException occurs here

MSDN 给出的建议不包括空数组的情况。 http://msdn.microsoft.com/en -us/library/18132394%28v=VS.100%29.aspx

顺便说一句,您可能想知道为什么我想固定一个空数组。简短的答案是,为了代码简单性,我想将空数组和非空数组视为相同。

In C++/CLI, is it possible to pin an array that contains no elements?

e.g.

array<System::Byte>^ bytes = gcnew array<System::Byte>(0);
pin_ptr<System::Byte> pin = &bytes[0]; //<-- IndexOutOfRangeException occurs here

The advice given by MSDN does not cover the case of empty arrays.
http://msdn.microsoft.com/en-us/library/18132394%28v=VS.100%29.aspx

As an aside, you may wonder why I would want to pin an empty array. The short answer is that I want to treat empty and non-empty arrays the same for code simplicity.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

千と千尋 2024-11-04 00:19:07

不,不能使用 pin_ptr<>。您可以回退到 GCHandle 来实现相同的目的:

using namespace System::Runtime::InteropServices;
...
    array<Byte>^ arr = gcnew array<Byte>(0);
    GCHandle hdl = GCHandle::Alloc(arr, GCHandleType::Pinned);
    try {
        unsigned char* ptr = (unsigned char*)(void*)hdl.AddrOfPinnedObject();
        // etc..
    }
    finally {
        hdl.Free();
    }

在我看来,您应该使用 List^ 来代替。

Nope, not with pin_ptr<>. You could fallback to GCHandle to achieve the same:

using namespace System::Runtime::InteropServices;
...
    array<Byte>^ arr = gcnew array<Byte>(0);
    GCHandle hdl = GCHandle::Alloc(arr, GCHandleType::Pinned);
    try {
        unsigned char* ptr = (unsigned char*)(void*)hdl.AddrOfPinnedObject();
        // etc..
    }
    finally {
        hdl.Free();
    }

Sounds to me you should be using List<Byte>^ instead btw.

情何以堪。 2024-11-04 00:19:07

您无法固定具有 0 个零元素的 cli 对象 array,因为该数组没有内存支持。显然,您无法固定没有内存可指向的东西。

然而,cli 对象 array 元数据仍然存在,并且它声明数组长度为 0。

You cannot pin a cli object array with 0 zero elements because the array has no memory backing. You obviously cannot pin something that has no memory to point to.

The cli object array metadata still exists, however, and it states that the array length is 0.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文