C++ 正在清除向量“glibc检测到:双重自由或损坏(fasttop)”中的GMP变量

C++ 正在清除向量“glibc检测到:双重自由或损坏(fasttop)”中的GMP变量,c++,memory,gmp,C++,Memory,Gmp,我正在运行下面的最小工作示例,用于在向量中存储一些GNU多精度库GMP编号mpz_类,然后清除分配的内存,如下所示: #include <limits> #include <iostream> #include <algorithm> #include <vector> #include <math.h> #include <stdio.h> #include <gmp.h> #include <gmpxx

我正在运行下面的最小工作示例,用于在向量中存储一些GNU多精度库GMP编号mpz_类,然后清除分配的内存,如下所示:

#include <limits>
#include <iostream>
#include <algorithm>
#include <vector>
#include <math.h>
#include <stdio.h>
#include <gmp.h>
#include <gmpxx.h>

std::vector<mpz_class> GenVector(int n) {
   std::vector<mpz_class> result;
   mpz_class x("45642346"), y("45345345");
   for(int k=0; k<n; k++) {
   result.push_back(x + k*y);
   }
   return result;
}

int main() {
  int n(5);
  std::vector<mpz_class> states = GenVector(n);
  for(size_t k=0; k<states.size(); k++) std::cout<<states[k].get_mpz_t()<<std::endl;
  mpz_clear(states[0].get_mpz_t()); //OFFENDING LINE
  return 0;
}
答案是正确的,但似乎有记忆损伤;但是如果我将有问题的行中的索引从0更改为其他任何东西,比如说1,那么就没有问题了。有人能澄清发生了什么事吗?谢谢


注意:编译和链接的命令是g++Program.cpp-o Program.exe-lgmpxx-lgmp

我对这个库一无所知,但在我看来,mpz_类应该处理mpz_t的生存期,你不应该自己调用mpz_clear。调用MPZJULL的必要性是在C API中没有析构函数,但是MPZI类是C++ API的一部分。在这种情况下,如何释放mpz_类占用的空间对我来说并不清楚。有什么线索吗?我意识到也许是说.clear是使用std库的一种替代方法。@MaviPranav在这种情况下,如何释放mpz_类占用的空间我不清楚。-您需要阅读有关C++语言和STL库的内容:另外,由于您似乎提前知道n,所以在向向量中插入数据之前,请始终对向量调用reserve方法,以免您想为痛苦的中间调整大小付出代价。或者,您可以使用适当的“构造函数”,它允许您指定大小。换句话说,一旦结果变量超出范围,因为它是静态分配的局部变量,一旦它超出范围,连同它的内容,它将被自动处理,因为MPZJ类对象是C++构造。具有相应的析构函数。请看一看更详细的解释。
45642346
90987691
136333036
181678381
227023726
*** glibc detected *** ./Test: double free or corruption (fasttop): 0x000000000181d220 ***
======= Backtrace: =========