2
votes

Programme C ++ utilisant une bibliothèque c - Conversion d'un pointeur intelligent en pointeur de style C brut?

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 .


1 commentaires

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.


3 Réponses :


2
votes

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 () 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 , afin d'appeler le constructeur après le malloc .


5 commentaires

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.



4
votes

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


0 commentaires

1
votes

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?


0 commentaires