J'utilise la bibliothèque ac dans un programme c ++.
Une fonction de la bibliothèque nécessite des pointeurs vers des tableaux et des scalaires comme arguments, par exemple:
int PartGraphKway(idx t *nvtxs, idx t *ncon, idx t *xadj, idx t *adjncy, idx t *vwgt, idx t *vsize, idx t *adjwgt, idx t *nparts, real t *tpwgts, real t ubvec, idx t *options, idx t *objval, idx t *part);
I actuellement, utilisez simplement new
et delete
, pour créer les structures, les remplir et les transmettre à la méthode.
Je veux utiliser des points intelligents dans mon Programme C ++. Puis-je créer des points intelligents et les convertir en pointeurs bruts lorsque je les transmets à la fonction?
Par conséquent, je n'ai pas besoin d'appeler delete
.
3 Réponses :
Cela dépend de qui libère le pointeur. Si le code C ++ le libère, std :: unique_ptr :: get ()
fournira le pointeur brut, et l'objet sera toujours automatiquement libéré lorsque l'objet unique_ptr
est détruit.
Si le code C prend possession du pointeur, il utilisera éventuellement free ()
pour libérer la mémoire. Vous pouvez appeler std :: unique_ptr :: release () code >
pour que le pointeur intelligent abandonne sa propriété d'objet.
Vous devez également créer le (s) pointeur (s) avec malloc (au lieu de new
), et passer un deleter personnalisé au std :: unique_ptr
, pour appeler free (ptr)
. Si l'objet a un constructeur, vous devez appeler le placement new a>, afin d'appeler le constructeur après le malloc
.
Je pense que cela lit trop dans la question. Je suis presque sûr, comme demandé, que la fonction c ne libère pas l'objet. Par conséquent, :: get ()
et une réponse plus simple suffira.
@MikeVine la question dit explicitement Par conséquent, je n'aurai pas besoin d'appeler delete
Oui, comme je l'ai lu, l'appelé appelle delete après l'appel.
@MikeVine l'appelé est écrit en C, donc l'appelé appelle free ()
. C'est UB d'appeler gratuitement
après nouveau
.
@eerorika J'ai mis à jour la réponse pour refléter vos préoccupations.
std :: vector
est probablement un bon choix si vous avez besoin d'allouer dynamiquement un tableau. Vous pouvez obtenir un pointeur brut vers le tampon interne en utilisant std::vector::data
.
Example:
std::vector<t> nvtxs(....); PartGraphKway(nvtxs.data(), ....); // no need to call delete; vector takes care of memory
Oui, vous pouvez utiliser les pointeurs intelligents comme vous le souhaitez. Les deux unique_ptr et shared_ptr vous permettront de lire le pointeur brut et de le passer comme argument pour zéro effort.
Étant donné que vous effectuez déjà la gestion de la mémoire avec new et delete, les autres préoccupations exprimées ne sont pas un problème?
Le C ++ est très flexible: vous pouvez soit l'utiliser pour inventer des problèmes artificiels qui n'existent pas en dehors du langage lui-même. Ou vous pouvez utiliser votre classe de conteneur préférée et sans bogue et vous concentrer sur l'écriture du programme réel.