【问题标题】:What does it mean double free detected in tcache 2 while using mpz?使用 mpz 时在 tcache 2 中检测到双释放是什么意思?
【发布时间】:2019-08-22 20:07:30
【问题描述】:

我使用这个程序来存储一个 mpz 值,但是当我添加一个 0 ( 4000000000000000000000000000000000000000 而不是 40000000000000000000000000000000000000 -> 38 0s 而不是 37)我得到

free(): 在 tcache 2 中检测到双重空闲

中止(核心转储)

#include <iostream>
#include <gmpxx.h>
#include <vector>
using namespace std;

int main(const int argc, const char * const argv[])
{
char *str= (char*)malloc(sizeof(char)*1024);
mpz_class l;
l=40000000000000000000000000000000000000_mpz;
mpz_set_str(l.get_mpz_t(), str, 10);
cout<<endl<<str;
return 0;
}

是否有可能存储大量数字?

谢谢

【问题讨论】:

  • 我应该如何声明str?只有在我阅读了这些论点后,我才能知道“信息”有多长。有没有办法只声明一个指针?
  • 这是使用 C 样式字符串时的常见问题。如果您不知道消息可能有多大,通常最好假设最坏的情况并分配最大可能的消息。由于现在这是一个静态大小的分配,请考虑使用自动变量。例如,考虑使用char str[1024]; 代替char *str= (char*)malloc(sizeof(char)*1024);。将来更少的内存管理问题。

标签: c++ memory rsa gmp alloc


【解决方案1】:

您的代码具有未定义的行为,因为您试图从未初始化的数组 str 分配 l

我猜你把你的函数弄糊涂了,打算写相反的

mpz_get_str(str, 10, l.get_mpz_t());

该代码将l 分配给str

使用以下代码计算str 需要多大

size_t size = mpz_sizeinbase(l.get_mpz_t(), 10) + 2;

【讨论】:

  • 这里是对+ 2部分的解释:“正确的分配量通常比mpz_sizeinbase返回的值多两个,一个额外的用于减号,一个用于空终止符。"
猜你喜欢
  • 2022-01-08
  • 2020-01-22
  • 2022-11-16
  • 2021-12-19
  • 2022-01-05
  • 1970-01-01
  • 2021-07-25
  • 2021-05-04
  • 1970-01-01
相关资源
最近更新 更多