gpt4 book ai didi

objective-c - 我分配的内存正在被写入

转载 作者:行者123 更新时间:2023-11-30 14:30:11 24 4
gpt4 key购买 nike

我正在用 Objective-C 编写一个项目,但我非常依赖普通的旧 C,因为涉及 OpenGL。

我有一个数据 blob,通过以下方式从文件读取到内存:

NSString *path = [[NSBundle mainBundle] pathForResource:@"iPadTest" ofType:@""];
NSFileHandle *file = [NSFileHandle fileHandleForReadingAtPath:path];
data = [file readDataToEndOfFile];
currentImage = [ReadDataFiles getOrganizedImageData:data];

最后一个函数为我提供了一个结构,其中数据更容易访问,但仍然存在三个冗长的图像数据数据 block 。事情是这样开始的:

ImageData *organizedImageData = malloc(sizeof(ImageData));

// IMAGE DIMENSIONS
UInt64 *rawData = (UInt64 *) data.bytes;
organizedImageData->imageDimensions.x = *rawData;
rawData++;
organizedImageData->imageDimensions.y = *rawData;
rawData++;
organizedImageData->imageDimensions.z = *rawData;

// IMAGE 1
rawData++;
organizedImageData->image1Data = (UInt8*)rawData;
// IMAGE 2
rawData++;
organizedImageData->image2Data = (UInt8*)rawData;

// etc...

问题在于,当数据到达 OpenGL 函数时,其他内容已写入同一内​​存中。每次结果都不同,但数据永远不会持久。

当我告诉调试器在这些地址发生更改时暂停时,我最终会得到无法生成任何内容的汇编代码。

我应该如何以及在哪里分配内存空间,以便程序的其余部分不会愚弄它?

最佳答案

问题是您不拥有名为 data 的变量,并且几乎可以肯定在您第一次遇到自动释放池耗尽时它会被释放(或者如果您正在使用 GC,它会在超出范围后消失)。当data消失时,您精心创建的所有指向[data bytes]的指针都将悬空。

在引用计数环境中,您需要在自动释放池耗尽之前将 -retain 发送到 data(当您返回到运行循环时保证会发生这种情况) )然后当你完成其中的数据后需要释放它。在 GC 环境中,您只需要保留一个强引用,例如使其成为某个对象的 ivar。

或者,您可以将数据复制到其他地方,而不仅仅是创建指向数据位的指针。

关于objective-c - 我分配的内存正在被写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3619062/

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