首页 > 解决方案 > 如何阻止函数的内存泄漏

问题描述

tl;dr: 如何在没有随机文本的情况下将无符号 32 位整数转换为 chars/uint8_t

好吧,我愿意为此牺牲几个声望点。我需要快速将 4 字节无符号整数转换为数组字节,以便读取/写入/操作我自己结构的二进制文件。
这样我就可以读取一个结构,然后将它用作一个对象,而不是读取它,而是为每个更改写入它。

但是当我尝试实现一个功能时,我得到了泄漏。指针只是不断添加函数范围之外的值。

void trans_byte( uint32_t &A, uint8_t *out ){
    // i did this with loop too same thing happens
    uint8_t *ptr = (uint8_t*)&A;
    out[3] = *ptr;
    ptr++;
    out[2] = *ptr;
    ptr++;
    out[1] = *ptr;
    ptr++;
    out[0] = *ptr;
    ptr = ptr - 4;
}

uint32_t trans_ray( uint8_t *in ){
    return ( in[0] << 24 ) | ( in[1] << 16 ) | ( in[2] << 8 ) | in[3]; 
}

主要是:

int main(){
    std::cout << "SHUGA" << std::endl; // test printing to see if test works 

    uint32_t ADR = 0x6D4E4344; // memory should write magic of mNCD

    uint8_t ret[4];// array to be "outed" from function
    trans_byte(ADR, ret); // function
    uint8_t ret2[4] = { ret[0], ret[1], ret[2], ret[3] }; //copy of array to see if issue happens if i copy it

    std::cout << ret << std::endl; // printing the array 1
    std::cout << ret2 << std::endl; // printing the array 2
}

和输出:

SHUGA
mNCDmNCD // keep in mind I called the function only once. 
mNCD

在我添加到主要之后

std::cout << "shiya" << std::endl;
uint32_t ADR2 = trans_ray(ret);

std::cout << ret << std::endl;
std::cout << ret2 << std::endl;
std::cout << (ret==ret2) << std::endl;

然后我得到了这个可爱的混乱:

SHUGA
mNCDmNCD─[uÉ@
mNCD─[uÉ@
shiya
mNCDmNCD─[uÉ@
mNCD─[uÉ@
0

所以我猜测这是某种内存泄漏,并且指针会在以后继续读取内存或其他内容(因此会出现大量符号)。

那么,即使没有调用数组,如何在没有指针继续读取和操作数组的情况下从uint32_t到来回转换?uint8_t

在您开始评论之前:
我不想使用std::vector,因为我不想将每个文件另外 20kb 左右的二进制数据添加到现有的大型项目中,无论是文件还是 PE。
我不能使用std::string,因为我不想寻找字符串末端\x00
我尝试使用unions,但字节是相反的,对于幻数和类似的,我需要它们按顺序排列。即使我尝试反转数组,我仍然需要解决这个问题。
我尝试使用struct-ures 和class-es,但是当我更改对象中的某些内容并且需要更新文件时,在编写代码块时我仍然会遇到这个问题。

标签: c++arrays

解决方案


 std::cout << ret

这需要一个以空字符结尾的字符串(此处为信息):

8) 如同 *this << s 一样输出实现定义的字符串,其中 s 是以空字符结尾的字符类型字符串。

否则它将继续打印,直到\0找到为止。

这就是我们使用向量、字符串等的原因。忘记所有这些 C 风格的 1980 年编程。除非您正在编写一些具有 20KB RAM 的超级微控制器,否则内存应该不是问题。


推荐阅读