Komunikat "Heap may be corrupted" - jak się go pozbyć?

0
 	long *WprowadzElementyTablicy()
		{

			
      	   //Pobieranie Rozmiaru Tablicy
			
			long *tab=new long [n];
            n=PobieranieLiczbyElementow();

			if(checkBox6->Checked)
			{
				//Losowo wygeneruj Elementy

              for(long i=0; i<n;i++)
				{
					tab[i]=(rand() % 1000);
				}
			}
			else	
			{
			// Wprowadzenie Ręczne Elementow Tablicy
			//Długość znaków i licznik niezależny od przecinkow
			long max=0,licznik=0;
			char znak;
			max=System::Convert::ToInt32(this->textBox2->TextLength);
			for(long i=0; i<max;i++)
			{
				znak=System::Convert::ToChar(this->textBox2->Text[i]);
					if(znak==',')
					{
						//omiń znak ( nic nie rob)
					

					}
					else
					{
					  
					  tab[licznik] =System::Convert::ToInt32(this->textBox2->Text[i]); 
					  licznik++;		 
					}		
			}

			}


			return tab;
			
		}




// Wczytywanie Sortowań

		void SortowanieBąbelkowe()
		{
	    	double roznica;
			long *tab=new long [n];
			tab=WprowadzElementyTablicy();
		
			start = clock();
           //Sortowanie bąbelkowe 
	long long swap=0, t=0;

				for(long long  i=0; i <n;i++)
				{
					for (long long j=1;j<n-i;j++)
					{
						if(tab[j-1]>tab[j])
						{
						swap=tab[j];
						tab[j]=tab[j-1];
						tab[j-1]=swap;
						}
								t++;	
					}
				}
			//Koniec Sortowania bąbelkowego
				koniec = clock();
				roznica=(long)(koniec-start);
	
			Raport(tab,koniec);
			

		}
   tab=WprowadzElementyTablicy();

w tej linijce występuje komunikat heap may be corrupted. Niestety nie mam pomysłu jak to rozwiązać.

0

Jak wpisze tak jak ty proponujesz to mam cannot be assigned to an entity of type " long".

0
long *WprowadzElementyTablicy()

zwracanie gołego wskaźnika to zły pomysł: raz że łatwo się zapomnieć i zwrócić wskaźnik do zmiennej tymczasowej, a dwa że łatwo zapomnieć o zwolnieniu tej pamięci.

Jak już piszesz w C++/CLI (o czym świadczy użycie System::Convert) to zwracaj tablicę zarządzaną (cli::array).
std::vector również będzie dobrym pomysłem.

max=System::Convert::ToInt32(this->textBox2->TextLength);

Nie rozumiem po co konwertujesz inta na inta.

max = this->textBox2->TextLength;
znak=System::Convert::ToChar(this->textBox2->Text[i]);

konwertujesz Char na Char, czyli wchar_t na wchar_t, a potem zupełnie nieprawidłowo obcinasz dwubajtowy wchar_t do jednobajtowego char.
Wywal Convert i zdefiniuj znak jako wchar_t.

1

naradę nikt tego nie widzi?

long *tab=new long [n];
n=PobieranieLiczbyElementow();
...
for(long i=0; i<n;i++) {
   tab[i]=(rand() % 1000);
}

Problem pierwszy: zła kolejność! Najpierw używasz n a potem nadajesz mu wartość. Efekt jest taki, że wypełniając tablice wartościami używając innego n naruszasz strukturę sterty.

Problem drugi: masz ewidentny wyciek pamięci:

long *tab=new long [n];
tab=WprowadzElementyTablicy();

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