草庐IT

c++ - 删除类数组指针时出错

coder 2024-06-16 原文

尝试弄清楚为什么我在此数组指针上使用 delete 时会出错?

正在尝试加载 png 图像,但不确定发生了什么

错误出现在使用delete[] chunks;

代码

typedef struct {
    char r;
    char g;
    char b;
    char a;
} pixel;

class chunk {
public:
    unsigned char length[4];
    unsigned char type[4];
    unsigned char* data;
    unsigned char CRC[4];

    ~chunk()
    {
        delete[] data;
    }
};

class PNG
{
public:
    PNG();
    PNG(std::string filename);
    ~PNG();
    void loadFile(std::string filename);
    pixel* get();
private:
    pixel * img;
    int width;
    int height;
    int bitdepth;
    int colourtype;
    int compressionmethod;
    int filtermethod;
    int interlacemethod;

    unsigned char* data;
    std::ifstream* file;

    int char2int(unsigned char* arr, int start);
};

void PNG::loadFile(std::string filename)
{
    file = new std::ifstream(filename.c_str(), std::ios::in | std::ios::binary);

    size_t size = 0;
    file->seekg(0, std::ios::end);
    size = file->tellg();
    file->seekg(0, std::ios::beg);

    data = new unsigned char[size];
    file->read((char*)data, size);

    /*
    for (int i = 0; i < size; i++) {
    std::cout << std::hex;
    std::cout.width(2);
    std::cout.fill('0');
    std::cout << (int)data[i] << std::endl;
    }
    */

    size_t index = 8; // ignore header
    chunk* chunks = new chunk[size];

    size_t chunkindex = 0;
    while (index < size) {
        for (int i = 0; i < 4; i++) {
            chunks[chunkindex].length[i] = data[index++];
        }
        std::cout << "Size of Chunk " << chunkindex + 1 << ": " << char2int(chunks[chunkindex].length, 0) << std::endl;
        chunks[chunkindex].data = new unsigned char[char2int(chunks[chunkindex].length, 0)];

        for (int i = 0; i < 4; i++) {
            chunks[chunkindex].type[i] = data[index++];
        }

        if (char2int(chunks[chunkindex].length, 0) != 0) {
            for (int i = 0; i < char2int(chunks[chunkindex].length, 0); i++) {
                chunks[chunkindex].data[i] = data[index++];
            }
        }

        for (int i = 0; i < 4; i++) {
            chunks[chunkindex].CRC[i] = data[index++];
        }

        chunkindex++;
    }

    for (int i = 0; i < chunkindex; i++) {
        char name[5];
        for (int j = 0; j < 4; j++) {
            name[j] = chunks[i].type[j];
        }
        name[4] = '\0';

        if (strcmp(name, "IHDR") == 0) {
            std::cout << "FOUND IHDR" << std::endl;
            width = char2int(chunks[i].data, 0);
            height = char2int(chunks[i].data, 4);
            bitdepth = chunks[i].data[8];
            colourtype = chunks[i].data[9];
            compressionmethod = chunks[i].data[10];
            filtermethod = chunks[i].data[11];
            interlacemethod = chunks[i].data[12];

        }
        else if (strcmp(name, "PLTE") == 0) {
            std::cout << "FOUND PLTE" << std::endl;
        }
        else if (strcmp(name, "IDAT") == 0) {
            std::cout << "FOUND IDAT" << std::endl;
        }
        else if (strcmp(name, "IEND") == 0) {
            std::cout << "FOUND IEND" << std::endl;
        }

    }


    std::cout << "Width: " << width << std::endl;
    std::cout << "Height: " << height << std::endl;

    delete[] chunks;
}

错误: 0xC0000005:访问冲突读取位置0xFFFFFFFFFFFFFFFF

最佳答案

将默认构造函数添加到您的 chunk类(class)。

chunk::chunk () {
   data = 0;
}

当你打电话时

    chunk* chunks = new chunk[size];

size对象已创建,所有创建的对象在 data 中都有垃圾数据变量 - 此成员未初始化。当你打电话时

    delete[] chunks;

对于 chunks 的每个对象数组 dtor 被调用,但是当 data未设置成员 - delete[] data是未定义的行为。

data没有为您的 chunks 中的所有对象设置成员array - 查看你的 while 循环:你为 data 分配内存此行的成员

        chunks[chunkindex].data = new unsigned char[char2int(chunks[chunkindex].length, 0)];

但不是针对所有创建的对象,因为在你的 while 循环中每一次迭代 index增加了多次但chunkindex只有一次。当 while 循环被这个条件停止时 index < size , chunkIndex不等于 size这意味着有 block 对象具有单元化 data成员(member)。

关于c++ - 删除类数组指针时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49189892/

有关c++ - 删除类数组指针时出错的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  3. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  4. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  5. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  6. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  7. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  8. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

  9. ruby-on-rails - 标准化文件名的字符串,删除重音和特殊字符 - 2

    我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin

  10. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

随机推荐