c++ - 如何阻止函数的内存泄漏
问题描述
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 << s 一样输出实现定义的字符串,其中 s 是以空字符结尾的字符类型字符串。
否则它将继续打印,直到\0
找到为止。
这就是我们使用向量、字符串等的原因。忘记所有这些 C 风格的 1980 年编程。除非您正在编写一些具有 20KB RAM 的超级微控制器,否则内存应该不是问题。
推荐阅读
- javascript - 尝试下载多个文件时如何检查Firebase存储中是否存在文件 - javascript
- jupyter-notebook - python pandas中用于进一步分析的url中的数据框(平均值、中位数等)没有给出正确的答案,但没有成功
- javascript - 如何通过 javasctiprt 方法获取浏览器 cookie 大小
- c++11 - 没有零拷贝的 FlatBuffers 有用吗?
- regex - “包含”时如何创建 CASE?
- fiddler - 如何在 Fiddler CustomRules.js 中遍历 JSON 响应中的数组?
- .htaccess - Htaccess 将 5000 多个 url 重定向到新的相对 url
- javascript - window.onstorage 不适用于 Angular
- azure - azure 函数中的函数超出了 00:05:00 的超时值
- elasticsearch - Elasticsearch 查询 multi_match