Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Conversione puntatore da un tipo a un altro
Forum - C/C++ - Conversione puntatore da un tipo a un altro

Avatar
solematto92 (Normal User)
Newbie


Messaggi: 5
Iscritto: 26/08/2017

Segnala al moderatore
Postato alle 17:32
Domenica, 10/06/2018
Salve, stò seguendo su youtube una guida di fcamuso sul c++11.
Nella lezione alla quale sono arrivato, tenta di convertire un puntatore double ad un puntatore di char.
Solamente che su vs2017, quando tento di fare anch'io la stessa cosa l'IDE lancia una Debug Assertion impedendomi di procedere col programma di esempio.
Vorrei capire se sono io che sbaglio qualcosa oppure è sbagliato il video che stò seguendo, non sò se è proibito da regolamento ma vi linko il video che parte dal minuto esatto che spiega questo argomento(https://youtu.be/ksS_Y9lMrcU?t=2m28s).

il mio codice è il seguente:
Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. int main() {
  7.         char* pChar = new char[100];
  8.         int* pInt = new int[100];
  9.         double* pDouble = new double[100];
  10.         long double* plDouble = new long double[100];
  11.         string* pString = new string[100];
  12.  
  13.         //pString[0] = string(1000, 'a');
  14.         //cout << pString[0] << endl;
  15.  
  16.         pChar = (char*)pDouble;
  17.  
  18.         cout << 100 * sizeof(char) << endl;
  19.         cout << 100 * sizeof(int) << endl;
  20.         cout << 100 * sizeof(double) << endl;
  21.         cout << 100 * sizeof(long double) << endl;
  22.         cout << 100 * sizeof(string) << endl;
  23.         cout << "--------------------------------\n";
  24.         cout << sizeof(char*) << endl;
  25.         cout << sizeof(int*) << endl;
  26.         cout << sizeof(double*) << endl;
  27.         cout << sizeof(long double*) << endl;
  28.         cout << sizeof(string*) << endl;
  29.  
  30.         delete[] pChar;
  31.         delete[] pInt;
  32.         delete[] pDouble;
  33.         delete[] plDouble;
  34.         delete[] pString;
  35. }


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5624
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 15:07
Martedì, 12/06/2018
In questo modo è corretto che dia l'asserzione. Il compilatore che non lo fa, sbaglia.

Una volta che scrivi

pChar = (char*)pDouble;

perdi il valore precedente di pChar (quello ottenuto con la new).

In questo modo la memoria allocata per pChar non risulta più deallocabile.

In più, cosa più grave, essendo diventato pChar una copia di pDouble, viene deallocato due volte e la seconda, ovviamente, scatta l'errore.

Devi preservare i valori dei puntatori quando fai questi esperimenti, scrivendo ad esempio

char pTmp = pChar;

prima di scrivere

pChar = (char*)pDouble;

e poi scrivendo

pChar = pTmp;

poco prima della prima delete.




Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
solematto92 (Normal User)
Newbie


Messaggi: 5
Iscritto: 26/08/2017

Segnala al moderatore
Postato alle 19:16
Sabato, 16/06/2018
quindi copiando l'indirizzo di pDouble nel puntatore  pChar è come se avessi lanciato un delete su pChar? oppure semplicemente ho fatto in modo che la memoria alloccata da pChar nella ram risulta "bloccata" impedendomi di dealoccarla e creando una situazione al quanto grave?

Grazie mille per la risposta

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5624
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 22:32
Domenica, 17/06/2018
Testo quotato

Postato originariamente da solematto92:

quindi copiando l'indirizzo di pDouble nel puntatore  pChar è come se avessi lanciato un delete su pChar?



No

Testo quotato

oppure semplicemente ho fatto in modo che la memoria alloccata da pChar nella ram risulta "bloccata" impedendomi di dealoccarla e creando una situazione al quanto grave?



Ti ripeto. Così perdi il valore del puntatore pChar e la zona allocata corrispondente non la puoi più deallocare da programma.
Ma la cosa PIU' GRAVE è che le delete successive tentano di deallocare due volte la stessa porzione di memoria (utilizzando lo stesso puntatore) e questo crea un errore grave.

Del resto, se non mi sbaglio, nel video non ci sono tutte le istruzioni delete ... le hai inserite tu?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote