如何停止功能中的内存泄漏
How to stop memory leakage from function
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,但是当我更改对象中的某些内容并且需要更新文件时,我仍然在编写代码块时最终遇到此问题。
std::cout << ret
这需要一个空的终止字符串(此处信息(:
8(输出一个实现定义的字符串,就像 *this&lt;&lt;s,其中s是零端的字符类型字符串。
否则它将继续打印直到找到