C++ PhysFS正在破坏前几个字节的数据

C++ PhysFS正在破坏前几个字节的数据,c++,physfs,C++,Physfs,所以,我正在编写的这个PhysFS类似乎正在破坏它读取的所有数据的前几个字符。其余的数据似乎很好 下面是调用的代码: std::vector<uint8_t> FileIO::vectorFromFile(std::string fileName) { auto buffer = std::make_shared<std::vector<uint8_t> > (*new std::vector<uint8_t>); if(PHYSF

所以,我正在编写的这个PhysFS类似乎正在破坏它读取的所有数据的前几个字符。其余的数据似乎很好

下面是调用的代码:

std::vector<uint8_t> FileIO::vectorFromFile(std::string fileName)
{
    auto buffer = std::make_shared<std::vector<uint8_t> > (*new std::vector<uint8_t>);
    if(PHYSFS_exists(fileName.c_str()))
    {
        PHYSFS_File* filenameHandle = PHYSFS_openRead(fileName.c_str());
        if (filenameHandle != 0)
        {
            bufferSize = PHYSFS_fileLength(filenameHandle);
            buffer->resize(bufferSize);
            PHYSFS_read (filenameHandle, &buffer->front(), sizeof(uint8_t), bufferSize);
            PHYSFS_close(filenameHandle);
        }
    }
    else
    {
        std::cerr << fileName << " doesn't exist.";
    }
    buffer->push_back((uint8_t) '\0');
    return *buffer;
}

SimpleFile FileIO::getSimpleFile(std::string fileName)
{
    SimpleFile file;
    std::vector<uint8_t> dataVector = vectorFromFile(fileName);
    file.data = &(dataVector[0]);
    file.sizeInBytes = dataVector.size();

    return file;
}
std::vector文件IO::vectorFromFile(std::string文件名)
{
自动缓冲区=标准::使共享(*新标准::向量);
如果(PHYSFS_存在(fileName.c_str()))
{
PHYSFS_File*filenamehold=PHYSFS_openRead(fileName.c_str());
if(filenamehold!=0)
{
bufferSize=PHYSFS_fileLength(filenamehold);
缓冲区->调整大小(缓冲区大小);
PHYSFS_read(filenameholder,&buffer->front(),sizeof(uint8_t),bufferSize);
PHYSFS_close(filenamehold);
}
}
其他的
{
标准:cerr

我认为您的数据超出了范围,被重新用于其他用途:

SimpleFile FileIO::getSimpleFile(std::string fileName)
{
    SimpleFile file;
    std::vector<uint8_t> dataVector = vectorFromFile(fileName);
    file.data = &(dataVector[0]);
    file.sizeInBytes = dataVector.size();
    return file;
}
SimpleFile文件IO::getSimpleFile(std::string文件名)
{
简化文件;
std::vector dataVector=vectorFromFile(文件名);
file.data=&(dataVector[0]);
file.sizeInBytes=dataVector.size();
返回文件;
}

一旦函数返回
dataVector
就消失了,因此
文件。数据是无效的指针。当然,我不太了解C++11可以覆盖它的新功能。

我认为您的数据超出了范围,正在被重新用于其他用途:

SimpleFile FileIO::getSimpleFile(std::string fileName)
{
    SimpleFile file;
    std::vector<uint8_t> dataVector = vectorFromFile(fileName);
    file.data = &(dataVector[0]);
    file.sizeInBytes = dataVector.size();
    return file;
}
SimpleFile文件IO::getSimpleFile(std::string文件名)
{
简化文件;
std::vector dataVector=vectorFromFile(文件名);
file.data=&(dataVector[0]);
file.sizeInBytes=dataVector.size();
返回文件;
}

<> >函数返回>代码>数据ave>代码>文件>数据>代码>无效指针。当然,我对C++ C++ 11个新特性的了解不太可能。

Fielo类的定义在哪里?它不在C++ STL中。请将源代码粘贴到您的帖子中,而不是链接。这是一个痛苦的往返。AH,Fielo是一个自定义类。头文件似乎不需要。堆栈溢出似乎没有代码标签,所以每行都缩进好像是一种痛苦。我很抱歉。FiEIO类的定义在哪里?它不在C++ STL中。请将源代码粘贴在您的帖子中而不是链接。这是一种痛苦的来回。啊,FileIO是一个自定义类。标题似乎没有必要。堆栈溢出似乎没有代码标记,所以缩进每一行似乎很痛苦。对此我很抱歉。嗯,是的,可能就是这样。不过,感谢邮件列表的建议,我刚刚用纯内存(一个新的[]uint8\t数组)替换了向量。基本上,我忽略了KISS原则,使用的是向量而不是数组。无论如何,极端的道具。@user1834037:当然,如果你的
SimpleFile
实际存储了
std::vector
而不是返回
uint8\u t
s的内存泄漏数组,那么这些都不需要。至少,你应该使用一个
std::unique\u ptr
来管理内存,这样你就不会出现泄漏。使用
std::vector
很简单;如果你在使用数组的任何地方都不使用它,那么它就变得复杂了。Headdesk是的,所以我把它改回了vector,但是放在SimpleFile而不是堆中的堆栈上。它工作起来更安全,所以谢谢。嗯,是的,这是p很有可能是这样的。不过,多亏了邮件列表的建议,我刚刚用普通内存(一个新的[]uint8\t数组)替换了向量。基本上,我忽略了KISS原则,使用的是向量而不是数组。无论如何,极端的道具。@user1834037:当然,如果你的
SimpleFile
实际存储了
std::vector
而不是返回
uint8\u t
s的内存泄漏数组,那么这些都不需要。至少,你应该使用一个
std::unique\u ptr
来管理内存,这样就不会发生泄漏。使用
std::vector
很简单;因为没有在使用数组的任何地方使用它,所以它变得复杂了。Headdesk是对的,所以我把它改回了vector,但是在SimpleFile而不是堆中的堆栈上。它工作起来更安全,谢谢。
#ifndef FILEIO_H
#define FILEIO_H

#include <string>
#include <vector>

struct SimpleFile;

class FileIO
{
private:
    int bufferSize = 0;
public:
    FileIO();
    ~FileIO();
    std::vector<uint8_t> vectorFromFile(std::string fileName);
    SimpleFile getSimpleFile(std::string fileName);
};

struct SimpleFile
{
    uint8_t* data;
    int sizeInBytes;
};

#endif // FILEIO_H
SimpleFile FileIO::getSimpleFile(std::string fileName)
{
    SimpleFile file;
    std::vector<uint8_t> dataVector = vectorFromFile(fileName);
    file.data = &(dataVector[0]);
    file.sizeInBytes = dataVector.size();
    return file;
}