Oppure

Loading
10/06/18 15:32
solematto92
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(youtu.be/…).

il mio codice è il seguente:
#include <iostream>
#include <string>

using namespace std;

int main() {
	char* pChar = new char[100];
	int* pInt = new int[100];
	double* pDouble = new double[100];
	long double* plDouble = new long double[100];
	string* pString = new string[100];

	//pString[0] = string(1000, 'a');
	//cout << pString[0] << endl;

	pChar = (char*)pDouble;

	cout << 100 * sizeof(char) << endl;
	cout << 100 * sizeof(int) << endl;
	cout << 100 * sizeof(double) << endl;
	cout << 100 * sizeof(long double) << endl;
	cout << 100 * sizeof(string) << endl;
	cout << "--------------------------------\n";
	cout << sizeof(char*) << endl;
	cout << sizeof(int*) << endl;
	cout << sizeof(double*) << endl;
	cout << sizeof(long double*) << endl;
	cout << sizeof(string*) << endl;

	delete[] pChar;
	delete[] pInt;
	delete[] pDouble;
	delete[] plDouble;
	delete[] pString;
}
aaa
12/06/18 13:07
nessuno
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 ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
16/06/18 17:16
solematto92
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
aaa
17/06/18 20:32
nessuno
Postato originariamente da solematto92:

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


No

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 ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.