Tout d'abord, il ne s'agit pas d'un duplicate. Ma question est de savoir comment le faire avec la mémoire dynamique. La raison pour laquelle ceci est distinct est parce que mon delete[]
est suspendu.Comment copier une chaîne terminée par un caractère non nul en mémoire dynamique
Alors, voici ce que j'ai:
class PacketStrRet {
public:
PacketStrRet(char p_data[], int p_len) : len(p_len) {
data = new char[p_len];
memcpy(data, p_data, p_len * sizeof(char));
}
~PacketStrRet() {
delete[] data;
data = nullptr;
}
char* data;
int len;
};
Et oui, je suis conscient que mon code n'utilise les meilleures pratiques. Je vais le nettoyer plus tard.
Le problème que j'ai est dans le DTOR. Cette suppression est suspendue pour toujours. Les données transmises au CTOR sont et non mémoire dynamique, donc je dois le rendre dynamique pour que les choses ne soient pas hors de portée. p_len
contient la bonne quantité de données, il n'y a donc pas de problème. De ce que j'ai lu, memcpy
semble être le coupable le plus probable ici. Alors, comment puis-je copier une chaîne qui n'est pas terminée par un caractère nul en mémoire dynamique, et être capable de la supprimer plus tard?
Merci.
Cela ressemble également à une violation des règles de trois. –
@KerrekSB, pouvez-vous mettre cela dans une réponse? – David
Ça a l'air ok. Vous pouvez supprimer le * sizeof (char) dans le memcpy tant que vous n'avez pas une plate-forme bizarre ou l'ajouter aussi à l'invocation 'new', mais cela ne devrait pas faire de différence. Je suppose que l'erreur est ailleurs. – Matthias247