问题标签 [raw-pointer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
419 浏览

rust - 通过原始指针克隆类型擦除的 Arc 是否安全?

我正在处理包装在 中的数据Arc,有时我最终会使用into_raw它来获取指向基础数据的原始指针。我的用例还需要类型擦除,因此原始指针通常会转换为 a *const c_void,然后在重新构造Arc.

我遇到了一种情况,能够克隆Arc而不需要知道基础数据的具体类型会很有用。据我了解,只要我从未真正取消引用数据,就应该安全地Arc仅出于调用的目的使用虚拟类型重构 。clone因此,例如,这应该是安全的:

有什么我遗漏的东西会使这实际上不安全吗?另外,我认为答案也适用Rc,但如果有任何差异,请告诉我!

0 投票
1 回答
772 浏览

rust - 将具有生命周期的借用引用转换为 Rust 中的原始指针

我是生锈的新手,我正试图将我的头包裹在生命周期中。请考虑以下代码:

JNIEnv::from_raw 方法的类型签名为from_raw(ptr: *mut JNIEnv) -> Result<Self>,因此会导致编译错误:

然后我尝试JNIEnv::from_raw(self._env as *mut JNIEnv<'a>).unwrap()了,但这导致:

如何从结构中的引用中获取有效的 JNIEnv?

干杯,谢谢你的时间!

更新

这是演示问题的一种不太人为的方式。

这导致:

ANativeWindow_fromSurface 的类型签名是ANativeWindow_fromSurface(env: *mut JNIEnv, surface: jobject) -> *mut ANativeWindow.

0 投票
2 回答
73 浏览

c++ - 从向量中删除元素后的段错误

我目前正在做一个项目,更准确地说是一个七巧板游戏。我有一个段错误的问题,我不明白为什么。

鉴于我有一个完整的项目,我将尝试简化问题:我有一个 GameManager 类,其中特别包含一个 Menu 对象(和其他东西,但我认为这并不重要。gameManager 用于初始化它对象并对其进行管理。菜单包含一个按钮向量(每个按钮都有一个 lambda,用于在用户单击它时执行一个操作)。

为了说明它是如何工作的,我将举一个例子:如果用户点击“加载”按钮,gameManager 会删除菜单中包含的当前按钮并在该菜单中添加新按钮。

在该代码示例中,我有一个方法 initMainMenuButtons 在菜单中添加了几个按钮,例如“加载”或“退出”。当用户单击“创建”时,我想更改界面(添加和删除按钮)。所以,要删除按钮,我调用方法 clear()

我正在使用 unique_ptr,因此,我不必手动删除按钮。到目前为止,没问题:按钮的向量似乎是空的(大小为 0)。接下来,调用方法 initCreateLevelButtons()。此方法与 initMainMenu 非常相似:它在菜单中添加按钮,仅此而已。在此调用期间,按钮似乎已正确添加到矢量中,我在最后打印了矢量的内容,并且矢量包含正确的按钮。

在那里,问题出现了:在调用 initCreateLevelButtons() 之后,当我想使用菜单时出现段错误,所以actionManager->setMenu(menu);不起作用。我尝试打印 menu std::cout << menu << std::endl,并测试此指针是否为 nullptr,但它也不起作用。我不明白为什么菜单在 initCreateLevelButtons() 的最后一行似乎是正确的,然后就变得无效。如果我不清除按钮的向量(菜单->清除指令),程序可以工作,但是最后一个按钮仍然在这里)。

我尝试使用原始指针,我注意到只要不删除按钮,程序就能够清除向量(如果我添加一个循环来删除按钮,就会出现问题),所以,我得出的结论是问题是按钮删除。我不明白为什么,我被卡住了。我不知道我是否解释过,因为正如我已经说过的,代码是整个项目的一部分,很难在不引入其他东西的情况下引入类。如果您需要详细信息或方法的完整代码,我可以提供。

0 投票
1 回答
85 浏览

rust - 我如何找出命名生命周期的来源?

我正在阅读rust-sdl2 的代码,并且有这个Texture结构:

我怎么知道'r生命从何而来?

0 投票
1 回答
33 浏览

c++ - 这个后面的地址是否保证与对象的变量相同

如果出现以下代码:

if 语句中的条件是否保证为真?

我进行了强制转换void*以确保比较原始地址,以防在比较特定指针类型时出现一些怪癖。

0 投票
1 回答
105 浏览

ios - 创建一个弱 UnsafeMutableRawPointer

所以我正在尝试使用 CoreAudio 方法AUGraphAddRenderNotify(...),但我需要引用在通知块中创建此通知的类。因为这是一个 C 函数,所以我不能简单地添加一个[weak self] in闭包捕获。查看文档,此方法的最后一个参数允许是UnsafeMutableRawPointer在块执行期间作为第一个参数传入的。按照这个建议,这是我的代码:

这是我的问题: 我需要弄清楚如何安全地获取该指针背后的值(占零)。更具体地说,我想安全地访问 audioPlayer 并确保在我使用它时它还没有被释放。目前,一切正常,直到 audioPlayer 被释放,然后我的应用程序崩溃。我知道我可以AUGraphRemoveRenderNotify(...)在对象被释放之前停止通知,但不幸的是这种方法不是我想要的。如何检查指针指向的对象是否已被释放?

提前致谢!

0 投票
1 回答
87 浏览

c++ - 在构造函数中使用原始指针以立即将其包装在智能指针中是否被认为是不好的做法?

我希望用户不必自己创建智能指针来传递给对象构造函数,而是传入原始指针,然后在初始化过程中转换为智能指针。但是,有一些关于创建内存泄漏的警钟响起,所以我想检查一下:以下代码是否有任何问题?

0 投票
1 回答
73 浏览

c++ - 如何正确实现具有原始指针的类的复制构造函数?

我在 C++ 中有一个 objcet,我通过extern "c"它作为指针导出。为了能够创建对象并返回它,我必须在堆上进行,考虑到尝试返回本地范围变量的范围问题。但是,为了在堆上分配,我必须能够复制一个我正在努力做的对象。这是一个例子:

将输出

表明该副本是浅拷贝。我知道

是问题,但为了修复它,我不断遇到分段错误。我尝试了各种形式的取消引用和获取内存地址以及尝试用memcpyand替换分配std::copy,这两种方法在 valgrind 中都非常不受欢迎。

我如何将此类修改为完全可复制,以便保存数据的内存位置不同但值相同?

0 投票
1 回答
403 浏览

c++ - Using a smart pointer to a struct from a C library which hides the implementation via typedef's (i.e. incomplete type)

I'm trying to use a C library which basically only exposes typedefs to structs that are used internally. The issue is that I want to use smart pointers to manage the lifetime of the raw pointers which are the interface to the library, but I cannot create the smart pointers because of an incomplete_type error. Note I have asked a previous question previous question trying to solve the same problem but the question turned out to be a poor representation of my actualy problem:

I cannot figure out how to use a smart pointer to the type that I need from the C library. Instead I've been using smart pointers to the underlying raw pointers (see below) but this isn't exactly what I'd like, and probably not ideal.

Here is some code:

So what is the best way to use this library from c++? Do I use the raw pointers and manage the life times manually? Do I use the smart pointer to the raw pointer? Or is there another way I haven't thought of.

0 投票
1 回答
438 浏览

c++ - 如何从原始 C 堆内存指针初始化 unique_ptr?

我正在使用一个函数(它是库的一部分),它返回一个uint8_t*指向已在堆上分配并保存图像像素数据的一些内存的原始指针。该函数的调用者负责调用free指针。

我调用此函数的代码有许多提前终止的分支,因此我需要free(buffer)在很多时候调用。我认为如果我可以将缓冲区包装在 a 中会更好,unique_ptr这样当它超出范围时,内存会自动释放。

我怎样才能做到这一点?

作为参考,函数 decleration 看起来像这样:(uint8_t* getFrame()我已经知道图像的宽度、高度和通道数以及缓冲区的长度);