Это, вероятно, дубликат, но предположим, что мы следующий кодкак функция/метод возвращает ссылку на объект внутри работы
#include <stdio.h>
#include <stdlib.h>
class IPair{
public:
IPair(const char *s) : s(s){
buffer = malloc(1024);
};
virtual ~IPair(){
free(buffer);
}
virtual void print() const = 0;
const char *s;
void *buffer;
};
class Pair : virtual public IPair{
public:
Pair(const char *s) : IPair(s){};
virtual void print() const override{
printf("Hello %s\n", s);
}
};
Pair createPair(const char *s){
return Pair(s);
}
IPair & usePair(IPair &pair){
pair.print();
return pair;
}
int main(int argc, char** argv)
{
Pair a = createPair("AAA");
Pair b = createPair("BBB");
usePair(a);
IPair &x = usePair(b);
usePair(x);
return 0;
}
Если рассмотрение с Valgrind, нет утечки памяти - например, деструктор называется правильным «местом».
Это увеличило следующие вопросы:
- что именно происходит внутри
createPair()
? Похоже, память объекта копируется. Является ли memcpy() похожим или что-то делать с конструктором копирования? - usePair() получить ссылку, а затем вернуть ту же ссылку назад. поскольку указанный объект все еще находится в основном() объеме, это должно быть safe операция - это предположение верно?
Любые причины использования malloc, а не новых или умных указателей? – Marcin
это утечка памяти. нет особой причины – Nick