Ich bin in einer verkabelten Situation gefangen; mein c++
Code verbraucht mehr Speicher (um 70G
erreichen), bis der gesamte Prozess getötet wurde.Speicherbelegungserhöhung
Ich rufe einen C++
Code von Python
an, der den Longest common subsequence length
Algorithmus implementiert.
Der C++
Code ist unten dargestellt:
#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;
}
Und mein Python
Code ist wie folgt:
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)
IMHO im C++
Code, nach dem new
Operation, die eine große Menge zuteilen könnte von Speicher auf dem Heap, würde es nicht mehr zusätzlichen Speicherverbrauch innerhalb der loop
geben.
Zu meiner Überraschung beobachtete ich jedoch, dass der verwendete Speicher während der loop
weiter ansteigt. (Ich verwende top
auf Linux
, und es hält i am her1
drucken, bevor der Prozess getötet wurde)
Es ist verwirrt mich wirklich an diesem Punkt, als ich nach der Speicherzuordnung erraten, gibt es nur einige arithmetische Operationen innerhalb des loop
, Warum benötigt der Code mehr Speicher?
Bin ich klar genug? Könnte mir jemand Hilfe zu diesem Thema geben? Vielen Dank!
C und C++ sind verschiedene Sprachen sehen würde! – Olaf
'4 * (36840 + 1) * (833841 + 1) * 4 = 122878292488' Es ist natürlich, mehr als 70G Speicher zu verbrauchen, wenn' int' 4 Bytes benötigt. Es wird ungefähr 114GiB verbrauchen. – MikeCAT
Ich habe gehört, dass 'malloc()' nur Speicher reservieren und den Puffer tatsächlich Speicher verbrauchen wird. Dasselbe kann mit "neu" passieren. – MikeCAT