Как создать экземпляр класса в памяти кучи - PullRequest
0 голосов
/ 23 апреля 2020

Тип класса "Pair" уже определен для вас. Вам нужно написать функцию с именем pairFactory, которая создает экземпляр Pair в куче. Не создавайте объект в стеке. Затем вашей функции необходимо вернуть указатель на этот созданный объект.

Я написал код для pairFactory. Кажется, работает, но я получаю InfraError. Пожалуйста, помогите мне найти мою ошибку. Также мне нужно создать объект в куче памяти.

#include <iostream>

// This class Pair has already been defined for you.
// (You may not change this definition.)
class Pair {
public:
  int first, second;
  void check() {
    first = 5;
    std::cout << "Congratulations! The check() method of the Pair class \n has executed. (But, this isn't enough to guarantee \n that your code is correct.)" << std::endl;
  }
};

Pair *pairFactory() {
  //
    Pair P;
    P.check();
  // (You can use as many lines as you want.)
  return &P;
}

// Your function should be able to satisfy the tests below. You should try
// some other things to convince yourself. If you have a bug in this problem,
// the usual symptom is that after you submit, the grader will crash with a
// system error. :-)
int main() {
    Pair *p;
    p = new pairFactory();

  // This function call should work without crashing:
  p->check();

  // Deallocating the heap memory. (Assuming it was made on the heap!)
  delete p;

  std::cout << "If you can see this text, the system hasn't crashed yet!" << std::endl;

  return 0;
}

Ответы [ 3 ]

2 голосов
/ 23 апреля 2020

Вы возвращаете ссылку на локальную переменную здесь.

Pair *pairFactory() {
    Pair P;
    P.check();
  return &P; // Dangling pointer
}

Таким образом, у вас есть свисающий указатель, как только вы покидаете функцию.

Вы должны вызвать new.

Pair *pairFactory()
{
  return new Pair{};
}

main может выглядеть так:

int main() {
  Pair* p = pairFactory();

  // This function call should work without crashing:
  p->check();

  // Deallocating the heap memory. (Assuming it was made on the heap!)
  delete p;

  std::cout << "If you can see this text, the system hasn't crashed yet!" << std::endl;
}

Лучше использовать умный указатель, чтобы не приходилось управлять памятью самостоятельно:

std::unique_ptr<Pair> pairFactory()
{
    return std::make_unique<Pair>();
}

int main() {
    auto p = pairFactory();

    p->check();
    std::cout << "If you can see this text, the system hasn't crashed yet!" << std::endl;
}
2 голосов
/ 23 апреля 2020

Вы получили это задом наперед. Ваша фабрика должна выделяться в куче. То, что вы делаете, возвращает адрес локального функционального объекта, который больше не существует.

Pair *pairFactory() {
  return new Pair;
}

А затем в вашей основной функции:

Pair *p = pairFactory();
1 голос
/ 23 апреля 2020

Вы сделали точно так, как вам сказали , а не , чтобы сделать:

Pair *pairFactory() {
    Pair P; // <----- creates an instance of Pair on the stack
    …
}

Цель этого упражнения, вероятно, заключалась в проверке ваших знаний оператора new. Смотрите здесь https://en.cppreference.com/w/cpp/memory/new/operator_new

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...