相关疑难解决方法(0)

随机malloc崩溃?

我正在尝试读取一个二进制文件,该文件具有以标识符开头的块(如3DS文件).我遍历文件并使用开关,程序确定块具有什么标识符,然后将数据读入文件结构.有时我需要使用malloc为动态大小的数据分配内存.在读取时,交换机经常会分配内存的相同情况,但是在文件中的特定点,它会在同一个malloc上崩溃.我想读的文件大约是1MB.但是当我用另一个大约10kB的文件和相同的结构来尝试该程序时,它会成功地读取它.

什么可能导致这个问题?


我在调试时得到的错误代码是:

Heap corruption detected at 0441F080
HEAP[prog.exe]: HEAP: Free Heap block 441f078 modified at 441f088 after it was freed
Run Code Online (Sandbox Code Playgroud)

此外,当我在调试模式下执行它时,由于某种原因,我可以从文件中读取更多数据.程序在崩溃之前会持续更长时间.


这是代码崩溃的代码:

switch (id) {
    case 0x62:
    case 0x63:
    // ...
        {
            char n_vertices = id - 0x60 + 1;// just how I calculate the n_vertices from the block ID
            fread(&mem.blocks[i].data.attr_6n.height, 2, 1, f);
            mem.blocks[i].data.attr_6n.vertices = malloc(2 * n_vertices);// crash
            for (short k = 0; k < n_vertices; k++) {
                fread(&mem.blocks[i].data.attr_6n.vertices[k], 2, 1, f);// read shorts
            }
        }
        break; …
Run Code Online (Sandbox Code Playgroud)

c dynamic-memory-allocation data-structures

1
推荐指数
1
解决办法
4825
查看次数

随机分段错误

我正在做一个游戏。在某些地方,有时我会收到分段错误,而在所有其他时间代码都可以正常工作。如果我再次运行游戏(在收到分段错误后)它会恢复(没有任何代码更改)并且运行良好。但过了一段时间又发生了这种情况。

我尝试使用 GDB 调试它。我得到以下信息:

  1. 有一个函数调用:func(&s.x),其中 s 是一个结构体,x 是它的 int 类型成员。地址 (&s.x) 是 0xb3456721
  2. 在函数 func 中,参数中接收到的值为 0xb。
  3. 程序崩溃说无法访问 0xb 处的内存。当我使用 GDB 打印变量时,我再次收到无法访问的内存。

任何想法为什么会发生这种情况?

c c++ segmentation-fault

1
推荐指数
1
解决办法
7025
查看次数

我怎么能控制free()函数工作正常?

我有一个关于C的free()函数的小问题.

我在程序中使用以下代码分配多维数组:

char **newMatrix( int N ){
    int i,j;
    char **a = malloc(sizeof *a * N);
    if (a)
    {
      for (i = 0; i < N; i++)
      {
        a[i] = malloc(sizeof *a[i] * N);
      }
    }
Run Code Online (Sandbox Code Playgroud)

在程序结束时,数组中充满了字符.所以我这样做是为了释放内存.

void freeArray(char **a, int m){
    int i;
    for (i = 0; i < m; ++i) {
        free(a[i]);
    }
    free(a);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,我怎样才能真正检查free()函数是否运行良好,并释放所有内存?我问你因为我试图在freeArray之后打印矩阵,结果是值仍然存储在a [i] [j]列和行中.

对不起,如果这是一个愚蠢的问题,我是C编程的新手!

c malloc free multidimensional-array

1
推荐指数
1
解决办法
100
查看次数

C++:在以下情况下内存是否会泄漏?

标题是问题.

我仍然不太了解动态分配存储的行为.

#include <utility>
int main() {
    // Case 1:
    volatile char *c1 = new char; // I'm gonna make these volatile, so the compiler won't change the code.
    volatile char *d1 = c1;
    delete d1;
    // Case 2:
    volatile char *c2 = new char[4];
    volatile char *d2 = c2;
    delete []d2;
    // Case 3:
    volatile char *c3 = new char;
    volatile char *d3 = std::move(c3);
    delete d3;
    // Case 4:
    volatile char *c4 = new char[4];
    delete c4++;
    delete …
Run Code Online (Sandbox Code Playgroud)

c++ memory-leaks

1
推荐指数
2
解决办法
128
查看次数

非常奇怪的C++行为

我在为学校作业编写的C++程序中遇到了一个非常奇怪的错误(最后粘贴的代码),我无法弄清楚它为什么会这样做.特别是,它有时会给出随机错误的输出,有时会提供正确的输出,每次都在相同的输入上运行.如果有人可能对原因有所了解,我会非常感激:

我做了一个C++程序,它有一个简单的MaxHeap数据结构的实现,它支持使用HeapInsert构建堆,从空堆开始逐个地将元素插入堆中,或者从元素数组开始并使用在元素的前半部分冒泡以将其转换为堆 - 程序采用一个命令行参数,HeapInsert将使用第一种构建堆的方法,或BubbleDown将使用第二种方法构建堆.

该程序从cin获取用户输入:首先是为了使堆出来而给出的元素数,然后是要放入堆中的元素.完成后,它输出在冒泡/冒泡中执行的交换次数,然后输出堆的元素,以便它们位于存储堆的数组中.

我们已经给出了一个示例输入(100个随机数)和一个我的代码应该生成的示例输出,以便知道我们的实现是正确的.我在命令行上执行以下操作:

g++ HeapTest.cpp
./a.out BubbleDown < 100.txt > out
diff out s100b.txt
Run Code Online (Sandbox Code Playgroud)

100.txt是样本输入,s100b.txt是正确的样本输出.

执行行

./a.out BubbleDown < 100.txt > out
diff out s100b.txt
Run Code Online (Sandbox Code Playgroud)

反复,我得到不一致的结果.似乎有一半的时间我得到了我的输出完全匹配样本文件,但有一半时间它没有,特别是当我查看我的输出文件时,它看起来像一个随机的大数字已被插入我的堆中没有原因,使我的输出错误.

对我来说,完全没有意义的结果是在使用完全相同的输入重复运行代码时会不一致.这只发生在我在命令行上使用"BubbleDown"选项时.以下是我的代码:

#include <cstdlib>
#include <stdint.h>       
#include <iostream>
#include <string>
#include <cstring>
#include <cassert>
#include <cmath>
using namespace std;

struct MaxHeap { //MaxHeap data structure
    int n;      //size of the heap
    int numex;  //number of exchanges in building the heap
    int* A;     //Array storing the actual heap
    MaxHeap(int a){     //First …
Run Code Online (Sandbox Code Playgroud)

c++

0
推荐指数
1
解决办法
423
查看次数

程序在64位系统中崩溃

以下代码在64位系统中崩溃.如果文件名长度小于3,则发生下溢'len'.但是该程序在32位系统中没有显示任何分段错误.但我在64位系统中遇到分段故障.为什么这个程序在32位系统中没有显示任何分段错误?

 DIR * dirp = opendir(dirPath);
 struct dirent * dp;
 while(dirp)
 {
   if((dp = readdir(dirp)) != NULL)
   {
    unsigned int len = strlen(dp->d_name);
    //underflow happens if filename length less than 3
    if((dp->d_name[len - 3] == 'j'))
    }
  }
Run Code Online (Sandbox Code Playgroud)

c c++ gdb

-1
推荐指数
1
解决办法
241
查看次数

是否有内存泄漏,我正确释放内存

亲爱的各位议员,我对是否在正确的地方释放记忆感到困惑.特别是*sResult?

int ReadToSerialPort( char *psResponse, int iMax)  
{  

    size_t iIn;  

    if ( fd < 1 )  
    {  
        printf( "port is not open\n" );  
        return -1;  
    }       

    iIn = read( fd, psResponse, iMax-1 );     
    if ( iIn < 0 )      
    {
        if ( errno == EAGAIN )  
        {  
            printf( "The errror in READ" );  
            return 0; // assume that command generated no response      
        }  
        else  
            printf( "read error %d %s\n", errno, strerror(errno) );  

   }  
   else   
 psResponse[(int)iIn<(int)iMax?iIn:iMax] = '\n';   

  return iIn;   

} …
Run Code Online (Sandbox Code Playgroud)

c++ memory-leaks

-3
推荐指数
1
解决办法
326
查看次数