Я попал в ловушку в проводной ситуации; мой код c++
продолжает потреблять больше памяти (около 70G
), пока весь процесс не будет убит.Увеличение объема памяти
Я вызываю код C++
от Python
, который реализует алгоритм Longest common subsequence length
.
C++
код показан ниже:
#define MAX(a,b) (((a)>(b))?(a):(b))
#include <stdio.h>
int LCSLength(long unsigned X[], long unsigned Y[], int m, int n)
{
int** L = new int*[m+1];
for(int i = 0; i < m+1; ++i)
L[i] = new int[n+1];
printf("i am hre\n");
int i, j;
for(i=0; i<=m; i++)
{
printf("i am hre1\n");
for(j=0; j<=n; j++)
{
if(i==0 || j==0)
L[i][j] = 0;
else if(X[i-1]==Y[j-1])
L[i][j] = L[i-1][j-1]+1;
else
L[i][j] = MAX(L[i-1][j],L[i][j-1]);
}
}
int tt = L[m][n];
printf("i am hre2\n");
for (i = 0; i < m+1; i++)
delete [] L[i];
delete [] L;
return tt;
}
И мой Python
код выглядит так:
from ctypes import cdll
import ctypes
lib = cdll.LoadLibrary('./liblcs.so')
la = 36840
lb = 833841
a = (ctypes.c_ulong * la)()
b = (ctypes.c_ulong * lb)()
for i in range(la):
a[i] = 1
for i in range(lb):
b[i] = 1
print "test"
lib._Z9LCSLengthPmS_ii(a, b, la, lb)
ИМХО, в C++
коде, после new
операции, которая может выделять большое количество памяти в куче, не будет больше дополнительного потребления памяти внутри loop
.
Однако, к моему удивлению, я заметил, что используемая память продолжает расти во время loop
. (Я использую top
на Linux
, и он продолжает печатать i am her1
, прежде чем процесс был убит)
Это действительно смутило меня в этот момент, как я предполагаю, что после выделения памяти, есть только некоторые арифметические операции внутри loop
, почему код занимает больше памяти?
Я достаточно ясно? Может ли кто-нибудь помочь мне в этом вопросе? Спасибо!
C и C++ разные языки! – Olaf
'4 * (36840 + 1) * (833841 + 1) * 4 = 122878292488' Естественно потреблять более 70 ГБ памяти, если' int' занимает 4 байта. Он будет потреблять около 114 ГБ. – MikeCAT
Я слышал, что 'malloc()' только резервная память и использование буфера фактически потребляет память. То же самое может случиться с «новым». – MikeCAT