我正在尝试通过shared_ptr访问我之前使用calloc
方法分配的数据。出于某种原因,我无法在EXC_BAD_ACCESS
(我的代码段的最后一行)上访问它(继续使用glTexImage2D
崩溃)。
我的util方法加载数据:
shared_ptr<ImageData> IOSFileSystem::loadImageFile(string path) const
{
// Result
shared_ptr<ImageData> result = shared_ptr<ImageData>();
...
// Check if file exists
if([[NSFileManager defaultManager] fileExistsAtPath:fullPath isDirectory:NO])
{
...
GLubyte *spriteData = (GLubyte*) calloc(width * height * 4, sizeof(GLubyte));
...
// Put result in shared ptr
shared_ptr<GLubyte> spriteDataPtr = shared_ptr<GLubyte>(spriteData);
result = shared_ptr<ImageData>(new ImageData(path, width, height, spriteDataPtr));
}
else
{
cout << "IOSFileSystem::loadImageFile -> File does not exist at path.\nPath: " + path;
exit(1);
}
return result;
}
ImageData
的标头:
class ImageData
{
public:
ImageData(string path, int width, int height, shared_ptr<GLubyte> data);
~ImageData();
string getPath() const;
int getWidth() const;
int getHeight() const;
shared_ptr<GLubyte> getData() const;
private:
string path;
int width;
int height;
shared_ptr<GLubyte> data;
};
调用util类的文件:
void TextureMaterial::load()
{
shared_ptr<IFileSystem> fileSystem = ServiceLocator::getFileSystem();
shared_ptr<ImageData> imageData = fileSystem->loadImageFile(path);
this->bind(imageData);
}
void TextureMaterial::bind(shared_ptr<ImageData> data)
{
// Pointer to pixel data
shared_ptr<GLubyte> pixelData = data->getData();
...
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, data->getWidth(), data->getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, &pixelData);
}
仅供记录:如果我扔掉所有shared_ptr,我就能访问数据。 glTexImage2D
的签名:
void glTexImage2D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *data);
其他问题:通常您必须释放(spriteData),但由于我将数据提供给shared_ptr,当删除shared_ptr时数据是否会被释放?
答案 0 :(得分:4)
shared_ptr
无法猜测如何释放内存。默认情况下,它会尝试delete
,因为您没有使用new
,最终会发生灾难。
您需要告诉它如何操作:
shared_ptr<GLubyte>(spriteData, &std::free);
答案 1 :(得分:3)
我认为这是你的问题:
..., &pixelData);
您正在获取一个局部变量(类型为shared_ptr<GLubyte>
)的地址,该变量以静默方式转换为void*
,而不是从中获取指针。替换为:
..., pixelData.get());