PDA

Visualizza la versione completa : [c++]cancellare gli elementi di un vector di struct con puntatori


dario09
04-05-2017, 20:49
compilatore visual studio Express 2012 per Windows
vorrei cancellare gli elementi del vector,
devo usare Delete per liberare la memoria allocata con New e poi usare il metodo clear
o usare direttamente clear?.
io pensavo di utilizzare delete dentro un ciclo con un iteratore e poi clear
pero' ricevo il seguente errore.
Debug Error!
HEAP CORRUPTION DETECTED: after Normal block (#186) at 0x0095A4D0.
CRT detected that the application wrote to memory after end of heap buffer.
grazie.


#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <vector>
#include <stdio.h>
#include <tchar.h>
#include <conio.h>
using namespace std;
typedef struct name_servizio
{
LPTSTR lpNameService;
LPTSTR lpNameDisplay;
DWORD dwStateCurrent;
} un_servizio;
void ReadServices(void);

void _tmain()
{
ReadServices();
_getch();
}

void ReadServices(void)
{
vector<un_servizio>unSer;
vector<un_servizio>::iterator itSer;
un_servizio servizioCorrente;
un_servizio service;
service.dwStateCurrent = 0;
service.lpNameService =L"pippo";
service.lpNameDisplay =L"paperino";
servizioCorrente.lpNameService = new TCHAR[_tcslen(service.lpNameService)];
_tcscpy(servizioCorrente.lpNameService,service.lpN ameService);
servizioCorrente.lpNameDisplay = new TCHAR[_tcslen(service.lpNameDisplay)];
_tcscpy(servizioCorrente.lpNameDisplay,service.lpN ameDisplay);
servizioCorrente.dwStateCurrent = 2;
unSer.push_back(servizioCorrente);
servizioCorrente.dwStateCurrent = 5;
unSer.push_back(servizioCorrente);
servizioCorrente.dwStateCurrent = 8;
unSer.push_back(servizioCorrente);

itSer = unSer.begin();
for (; itSer != unSer.end(); itSer ++)
{
delete itSer->lpNameService;//Errore
delete itSer->lpNameDisplay;//Errore
}
}

dario09
07-05-2017, 10:17
salve,ho ripreso in mano il codice e ho visto che il problema era che allocavo la memoria
solo per il primo elemento del vector
ho inserito tutto in un ciclo For cosi 'da allocare memoria ad ogni elemento,inoltre nelle New ho aumentato di uno la richiesta di memoria e adesso funziona.
un saluto.




void ReadServices(void)
{
vector<un_servizio>unSer;
vector<un_servizio>::iterator itSer;
un_servizio servizioCorrente;
un_servizio service;
service.dwStateCurrent = 0;
service.lpNameService =L"pippo";
service.lpNameDisplay =L"paperino";
for(int c = 0;c <=2; c++)
{
size_t size_name = _tcslen(service.lpNameService);
servizioCorrente.lpNameService = new TCHAR[_tcslen(service.lpNameService)+1];
_tcscpy(servizioCorrente.lpNameService,service.lpN ameService);
servizioCorrente.lpNameService[size_name] = NULL;
servizioCorrente.lpNameDisplay = new TCHAR[_tcslen(service.lpNameDisplay)+1];
_tcscpy(servizioCorrente.lpNameDisplay,service.lpN ameDisplay);
servizioCorrente.dwStateCurrent = 2+c;
unSer.push_back(servizioCorrente);
}

for (itSer = unSer.begin(); itSer != unSer.end(); itSer ++)
{
wcout << itSer->lpNameService << endl;
wcout << itSer->lpNameDisplay << endl;
cout << itSer->dwStateCurrent;
}

itSer = unSer.begin();
for (; itSer != unSer.end(); itSer ++)
{
delete itSer->lpNameService;
delete itSer->lpNameDisplay;
}
unSer.clear();
}

Loading