Błąd przy usuwaniu tablicy dynamicznej

0

Witajcie mam bardzo dziwny problem, otóż dostałem błąd przy usuwaniu tablicy dynamicznej i nie widzę żadnego błędu jakiego mógłbym popełnić, bardzo proszę o pomoc w rozwiązaniu problemu

#include <iostream>
#include <fstream>
#include <ctime>

using namespace std;
void create_file(ofstream &File);

int main()
{
	srand(static_cast<unsigned int>(time(NULL)));
	int n, p, j, i = 0;
	
	cout << "Prosze o podanie liczby, ktora bedzie oznaczac liczebnosc zbioru z ktorej mam wypisac podzbiory\n";
	cin >> n;

	int *wskwyj = new int[n];
	int *temp = wskwyj;
     bool *wsk = new bool[n];
	bool *wsk1 = wsk;
	
    ofstream File;
	create_file(File);

  
	File << '[';
	for (int i = 0; i < n; i++)
	{
		*wskwyj = rand() % n + 1;
		File << *wskwyj << ",";
		wskwyj++;
	}
	File.seekp(-1, std::ios_base::end);
    File << "] \n";
	

	for (int i = 0; i < n; i++) *wsk++ = 0;
	
	wskwyj = temp;
	wsk = wsk1;
 
	do
	{
		
	    for (int i = 0; i < n; i++)
		{ 
			if (wsk[i] == 1)
			{
				File << wskwyj[i] << " ";
				
			}
			

		}
		
		File << "\n";
		
		
		i++; p = 0; j = i;
        while (j % 2 == 0)
		{
			j /= 2; p++;

		}

		if (p <= n) wsk[p] = ((1 - wsk[p]) != 0); //prosty trik ktory likwiduje warning


	} while (p < n);

	File.close();

	delete[] wskwyj;
	delete[] wsk;
	cout << "Prosze o zajrzenie do pliku, program zostal zakonczony\n";
	getchar();
	getchar();
	getchar();



}
//*********************************************************************************************
void create_file(ofstream &File)
{
	cout << "Prosze o podanie nazwy pliku z rozszerzeniem, jaki mam stworzyc do wypisywania wynikow\n";
	char tab[20] = { '\0' };
	bool type = false;
	cin >> tab;

	for (int i = 0; i < 20; i++)
	{
		if (tab[i] == '.') type = true;
	}
	if (!type)
	{
		cerr << "Nie podales rozszerzenia, koncze program\n";
		getchar();
		exit(0);
	}

	File.open(tab);
	if (!File) cerr << "Nie moglem stworzyc pliku\n";
}



Błąd powoduje ta linijka delete []wsk;

0

a nie po prostu delete wsk? delete[] wsk uzywa sie przy tablicach.

1
$ valgrind --tool=memcheck --leak-check=full ./a.out 
==10651== Memcheck, a memory error detector
==10651== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==10651== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==10651== Command: ./a.out
==10651== 
Prosze o podanie liczby, ktora bedzie oznaczac liczebnosc zbioru z ktorej mam wypisac podzbiory
5
Prosze o podanie nazwy pliku z rozszerzeniem, jaki mam stworzyc do wypisywania wynikow
lol.z
==10651== Invalid read of size 1
==10651==    at 0x8048E4A: main (prog.cpp:66)
==10651==  Address 0x4368075 is 0 bytes after a block of size 5 alloc'd
==10651==    at 0x4029DFC: operator new[](unsigned int) (vg_replace_malloc.c:383)
==10651==    by 0x8048C96: main (prog.cpp:19)
==10651== 
==10651== Invalid write of size 1
==10651==    at 0x8048E50: main (prog.cpp:66)
==10651==  Address 0x4368075 is 0 bytes after a block of size 5 alloc'd
==10651==    at 0x4029DFC: operator new[](unsigned int) (vg_replace_malloc.c:383)
==10651==    by 0x8048C96: main (prog.cpp:19)
==10651== 
Prosze o zajrzenie do pliku, program zostal zakonczony
^C==10651== 
==10651== HEAP SUMMARY:
==10651==     in use at exit: 0 bytes in 0 blocks
==10651==   total heap usage: 4 allocs, 4 frees, 8,569 bytes allocated
==10651== 
==10651== All heap blocks were freed -- no leaks are possible
==10651== 
==10651== For counts of detected and suppressed errors, rerun with: -v
==10651== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
 
 
if (p <= n) wsk[p] = ((1 - wsk[p]) != 0); //prosty trik ktory likwiduje warning
//powinno byc
if (p < n) wsk[p] = ((1 - wsk[p]) != 0); //prosty trik ktory likwiduje warning
1

Używanie nagiego new i delete w nowym kodzie C++ to anty-idiom. Masz kontenery, masz smart pointery. Jest rok 2016, a nie 1996.

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