如何停止功能中的内存泄漏

How to stop memory leakage from function

本文关键字:内存 泄漏 何停止 功能      更新时间:2023-10-16

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_tuint8_t来回进行此操作?

开始发表评论之前:
我不想使用std::vector,因为我不想在每个文件中添加另一个20kb左右的二进制数据,例如文件或pe。
我不能使用std::string,因为我不想寻找字符串端x00
我尝试使用unions,但是字节是逆转的,对于魔术数字,我需要它们井井有条。即使我尝试扭转数组,我仍然需要遇到这个问题。
我尝试使用struct -URES和class -ES,但是当我更改对象中的某些内容并且需要更新文件时,我仍然在编写代码块时最终遇到此问题。

 std::cout << ret

这需要一个空的终止字符串(此处信息(:

8(输出一个实现定义的字符串,就像 *this&lt;&lt;s,其中s是零端的字符类型字符串。

否则它将继续打印直到找到

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

如何将未签名的32位整数转换为chars/uint8_t,而无需随机文本

您可以为此union,但您必须阅读有关endianness的信息。尝试以下操作:

#include <stdint.h>
union {
    uint32_t _32ui;
    uint8_t _8ui[4];
}

我尝试使用工会,但是字节是逆转的,对于魔术数字,我需要它们井井有条。即使我尝试扭转数组,我仍然需要遇到这个问题。

有用于在big-endianlittle-endian订单中转换uint32_t的功能。我不确定您的操作系统,处理器和编译器。但是有类似于Linux的Htonl的功能。

所以我猜这是某种内存泄漏,指针会在以后的读取内存或其他内容(因此有很多符号(。

否。这不是问题。您不会在程序中分配任何会导致任何内存泄漏的内存,也不会超越分配的内存缓冲区。问题是您尚未通过std::cout文档,您可能忽略了compiler's warnings

std::cout已针对C风格的字符串过载,并期望null-terminated字符数组。但是您尚未提供其无效的终止角色阵列。我建议写一个简单的功能来打印您的数组。

void printArray(uint8_t *array, size_t size)
{
    for (size_t i = 0; i < size; i++)
        std::cout << array[i];
    std::cout << std::endl;
}