Я на 99% уверен, что ответом на это является ослепление нет . Пожалуйста, подтвердите мое предположение, что следующий код приведет к утечке памяти.
Data &getData()
{
Data *i = new Data();
return *i;
}
void exampleFunc()
{
Data d1 = getData();
Data d2;
/* d1 is not deallocated because it is on the heap, and d2 is
* because it is on the stack. */
}
Обратите внимание, что это слишком упрощенный пример, так что очевидно, что вы на самом деле не будете использовать вышеуказанный код ... Так что нет необходимости указывать на это спасибо.
Обновление 1:
Чтобы добавить к этому, что, если я назначу указатель на ссылку? В этом случае я предполагаю, что данные не копируются ...
Data &getData()
{
Data *i = new Data();
return *i;
}
void exampleFunc()
{
// Does copying occur here?
Data &d1 = getData();
// Does this deallocate the memory assigned to the pointer?
delete &d;
}
Обновление 2:
Полагаю, что для ответа на мой собственный вопрос (в обновлении 1) следующий код доказывает, что назначение ссылки на ссылку не приводит к копированию ...
#include <iostream>
#include <string>
using namespace std;
class Data
{
public:
string mName;
Data(const string &name) : mName(name)
{ cout << mName << " default ctor" << endl; }
Data(const Data& other)
{
mName = other.mName + " (copy)";
cout << mName << " copy ctor" << endl;
}
~Data()
{ cout << mName << " dtor" << endl; }
static Data &getData(const string &name)
{
Data *d = new Data(name);
return *d;
}
};
int main()
{
cout << "d1..." << endl;
Data d1 = Data::getData("d1");
cout << "d2..." << endl;
Data d2("d2");
cout << "d3..." << endl;
Data &d3 = Data::getData("d3");
cout << "return..." << endl;
return 0;
}
Дает следующий результат ...
d1...
d1 default ctor
d1 (copy) copy ctor
d2...
d2 default ctor
d3...
d3 default ctor
return...
d2 dtor
d1 (copy) dtor
Спасибо Эрику Мелски за отличный ответ (мой код в обновлении 2 - модифицированная копия его exmaple кода).