Duża tablica i dynamiczne przydzielanie

Odpowiedz Nowy wątek
2011-09-22 10:50
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;

Pozostało 580 znaków

2011-09-22 13:26
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 ;)

edytowany 2x, ostatnio: Sarrus, 2011-09-22 13:27

Pozostało 580 znaków

2011-09-22 14:02
0

Może po prostu trzeba na to czasu?


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał

Pozostało 580 znaków

2011-09-22 14:18
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)


"(...) otherwise, the behavior is undefined".
edytowany 1x, ostatnio: Endrju, 2011-09-22 14:18

Pozostało 580 znaków

2011-09-22 14:19
0

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

Olać czy wie czy nie, to i tak nie powinno tak długo trwać. - Endrju 2011-09-22 14:25
pewnie się odwołuje do tego jak do długich stringów i mu się program wiesza. - Azarien 2011-09-22 17:18

Pozostało 580 znaków

2011-09-22 14:29
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?


Pozostało 580 znaków

2011-09-22 21:02
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.

edytowany 1x, ostatnio: Tomek2, 2011-09-22 21:05

Pozostało 580 znaków

2011-09-22 21:09
0

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


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał
edytowany 2x, ostatnio: xeo545x39, 2011-09-22 21:10

Pozostało 580 znaków

2011-09-23 10:02
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;
}
edytowany 4x, ostatnio: warszyk, 2011-09-23 10:12

Pozostało 580 znaków

2011-09-23 12:02
0

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

po co tak dziwnie?


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 1x, ostatnio: krwq, 2011-09-23 12:03
Może to takie DRM? ;-) - vpiotr 2011-09-24 11:33

Pozostało 580 znaków

2011-09-25 21:47
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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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