尝试弄清楚为什么我在此数组指针上使用 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/
我正在用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.
我想为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
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
查看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
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我正在尝试编写一个将文件上传到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
在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?
我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin
如何将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.你能做的最好的事情是: