Duża tablica i dynamiczne przydzielanie

0

Witam,
mam taki problem, dynamicznie alokuje dużą tablicę, przeprowadzam na niej operacje, ale program w konsoli podczas wyłączania stoi w miejscu (bez żadnego komunikatu). Tak jakby delete bardzo się opóźniało, bez delete działa, ale boli jak się zostawia takie coś w pamięci :P

	string *zawartosc = new string[60000];
	string *zawartosc2 = new string[60000];

	delete []zawartosc;
	delete []zawartosc2;
0

Nie znam specyfiki działania delete, ale może warto wypchnąć to do wątku pobocznego i niech sobie tam w tle zwalnia pamięć. No chyba że zajmuje 100% procka ;)

0

Może po prostu trzeba na to czasu?

0

Hm wykonanie takiego kodu jaki podałeś (dodałem sobie jeszcze wypełnienie tych stringów jakimiś napisami) nie trwa u mnie nawet sekundy. To dziwne, żeby destruktor stringa robił coś tak długo.

Zobacz jak zadziała samo to, bez reszty Twojego programu:

#include <string>
#include <iostream>

using namespace std;

int main() {
  const int num = 60000;
  
  cout << "new" << endl;
  string *ptr1 = new string[num];
  string *ptr2 = new string[num];

  cout << "loop" << endl;
  for (int i = 0; i < num; ++i) {
    ptr1[i] = "ala ma kota blebleble";
    ptr2[i] = "janek ma psa i rybki srututu";
  }

  cout << "delete" << endl;
  delete [] ptr1;
  delete [] ptr2;
}

(gcc 4.6.1)

0

Zdajesz sobie sprawę, że to tworzy 2*60000 STRINGÓW, a nie 2 stringi po 60000 znaków?

0

U mnie też nie ma problemu z usunięciem takiej tablicy, więc zapewne problem tkwi w czymś innym. Możesz pokazać coś więcej?

0

Właśnie przetestowałem u siebie na VS 2010 Express - kod taki jak u Endrju - wynik jest taki, że alokacja pamięci i inicjalizacja stringów trwa moment, natomiast usuwanie u mnie zajmuje 13-14 sekund w wersji debug i 3 sekundy w wersji release.

0

U mnie w Code::Blocks na debug całość leci ~1s + pętla dla inicjalizacji string'ów. Czyli to samo co u Endrju.

0

Dzięki za pomoc! Przetestowałem ten kod i po pojawieniu się delete mineło ~20sek zanim się zaknął. Ale zarz zrobię upgrade swojego kodui sprawdzę ponieważ pierwszy raz przy programowaniu spotkałem się z czymś takim.
Proszę to mój kod, potrzebny był mi tak na szybko programik (po zakończeniu usuwanie tablic trwa ~20sek).
lukasz1235 wiem to i jest to mi potrzebne

ps. przepraszam, ale nie wiem czemu w tym oknie tekst się rozjechał

// doc.cpp : main project file.

#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>

using namespace std;
using namespace System;



int main(array<System::String ^> ^args)
{
	bool hlp = false;    
	int i=0;
	int j=0;
	int *lol;
	int lol1 = 0;
	int zaraz = 0;
	char taknie;

	int x;

		lol = &x;
		*lol=0;

        const int num = 60000;

	string *zawartosc = new string[num];
	string *zawartosc2 = new string[num];
	string *temp = new string[1000]; //tab pomocnicza dla porownania wynikow

	string sciezka, sciezka2, linia, linia2, FileName;



	ifstream plk;
	ifstream plk2;			
			
			while(*lol != 9)
			{
				cout<<endl<<"\n1-load nr1 \n2-load nr2 \n3-display nr1 \n4-display nr2 \n5-compare nr2 to nr1 \n6 change W1 -> R1 \n9-exit \nchoose:";
				cin>>*lol;
				cout<<endl;

					switch(*lol)
					{
					case 1:		//load 1
										while(!plk.is_open())
										{
										cout<<"sciezka1: C:/Users/user/Desktop/";
										cin>>sciezka;
											plk.open("C:/Users/user/Desktop/" + sciezka);
												if(plk.is_open()) cout<<"file 1 opened"<<endl;
												else cout<<"lol"<<endl;
										}
										while(getline(plk, linia))a
										{
				
											zawartosc[i] = linia;
											i=i+1;
										}
										cout<<"file 1 loaded"<<endl;

							break;

					case 2:			//load 2
										while(!plk2.is_open())
										{
										cout<<"sciezka2: C:/Users/user/Desktop/";
										cin>>sciezka2;
											plk2.open("C:/Users/user/Desktop/" + sciezka2);
												if(plk2.is_open()) cout<<"file 2 opened"<<endl;
												else cout<<"lol"<<endl;
										}	
										while(getline(plk2, linia2))
										{
				
											zawartosc2[j] = linia2;
											j=j+1;
										}
										cout<<"file 2 loaded"<<endl;
							break;

					case 3:		//dispplay 1	
								for(int k=0; k<i; k++)
								{
									cout<<zawartosc[k]<<endl;
								}
								break;

					case 4:		//dispplay 2	
								for(int k=0; k<j; k++)
								{
									cout<<zawartosc2[k]<<endl;
								}
								break;

					case 5:   //porownaj 2 do 1
								for(int k=0; k<i; k++)
								{
									for(int l=0; l<j; l++)
									{
										if(zawartosc[k] == zawartosc2[l]) 
										{
												temp[lol1] = zawartosc2[l];
												lol1 = lol1 +1;
												break;
										}
										else true;
									}
								}

								cout<<"\n"<<"positive results: "<<lol1<<endl;

								for(int k=0; k<lol1; k++)
								{
									cout<<temp[k]<<endl;
								}

								break;	
					case 6:	//save
												
								cout<<"save changes? (Y/N): ";
								cin>>taknie;
									
									if( taknie == 'Y' || taknie == 'y')
									{
										cin >> FileName;
										ofstream xyz(FileName, ios::out);

											for(int k=0; k<i; k++)
											{
												if( zawartosc[k][0] == 'W' && zawartosc[k][1] == '1') 
												{
													xyz<<zawartosc[k];
													zawartosc[k][0] = 'R';

													xyz<<'\t'<<zawartosc[k]<<endl;
												}
												else 
													xyz<<zawartosc[k]<<'\t'<<zawartosc[k]<<endl;

											}
											

										xyz.close();
									}
						
								break;
					case 9:
								break;
					}

			}

	plk.close();
	plk2.close();

	delete []zawartosc;
	delete []zawartosc2;
	delete []temp;	

	//system ("pause");
    return 0;
}
 
0

przewskaźnikowałeś ten kod:
int x;
lol = &x;
*lol=0;

po co tak dziwnie?

0
krwq napisał(a)

przewskaźnikowałeś ten kod:
int x;
lol = &x;
*lol=0;

po co tak dziwnie?

Trochę składni zapomniałem jak długo nie programowałem i rozpisywałem sobie :P

0

Ekhem, skoro i tak piszesz w C++/CLI to czemu nie użyjesz System::array?

0

Dzięki za pomoc All. Ostatecznie zrobiłem to w c# na listach i program bardzo szybko się wykonuje w porównaniu do tego co umieściłem.
Czy w tym przypadku c++ nie radzi sobie aż tak z dynamiczną alokacją pamięci :/

0

radzi bardzo dobrze, tylko w C# trzeba się postarać żeby coś spieprzyć

0

W C# zwalnianie zdaje się odbywa się w z góry nieokreślonym momencie, więc pewnie dlatego zakończenie programu wygląda bardziej optymistycznie.

0

Właśnie dlatego też zdziwiłem się, że rezerowałem miejsce np. dla listy i nie muszę jej kasować?

1 użytkowników online, w tym zalogowanych: 0, gości: 1