#include <iostream>
class ArrayClass
{
private:
int *m_Arr;
int i;
public:
int Size;
ArrayClass() : Size(5), i(0), m_Arr(nullptr)
{
std::cout << "The constructor was called." << std::endl;
}
~ArrayClass()
{
std::cout << "The destructor was called." << std::endl;
delete[] m_Arr;
}
void InitArr()
{
m_Arr = new int[Size];
}
void Setter(int &var)
{
*(m_Arr + i) = var;
i++;
}
int *Getter() const
{
return m_Arr;
}
};
int main()
{
ArrayClass *instance = new ArrayClass[2];
std::cout << instance << std::endl;
for (int j = 0; j < 2; j++)
{
(instance + j)->InitArr();
for (int i = 1; i <= (instance + j)->Size; i++)
{
(instance + j)->Setter(i);
}
int *Get = (instance + j)->Getter();
std::cout << "The numbers are:" << std::endl;
for (int i = 0; i < (instance + j)->Size; i++)
{
std::cout << *(Get + i) << std::endl;
}
}
for (int l = 0; l < 2; l++)
{
delete (instance + l);
}
std::cin.get();
return 0;
}
Я новичок в C++ и столкнулся с проблемой: я пытаюсь использовать ключевое слово delete, используя цикл for, вместо экземпляра delete[]. Я просто пытаюсь сохранить этот метод удаления массива экземпляров в куче, используя арифметику указателей. Но удаление не выполняет свою работу, когда я запускаю программу, фрагмент кода деструктора не распечатывается в cmd, программа просто завершает работу, не соблюдая строку std::cin.get();
Только это работает. delete[] instance;
.
Но я хочу, чтобы этот метод использовался,
for (int l = 0; l < 2; l++)
{
delete (instance + l);
}
Итак, не могли бы вы исправить ошибку.
Или метод, который я пытаюсь использовать, действителен даже на C++?
вам необходимо прочитать о правиле 3/5, чтобы понять следующие проблемы, с которыми вы столкнетесь
Вы не хотите использовать этот метод, потому что он неправильный. Купите себе хорошую книгу и перестаньте гадать.
«Только это работает. delete[] instance;
». потому что только это правильный способ удалить массив. Больше ничего особенного (кроме того, что вам вообще не следует использовать new
и delete
, но я полагаю, это для упражнения)
Кроме того, с указателями (и массивами) *(m_Arr + i)
работает точно так же, как m_arr[i]
.
Я голосую за закрытие этого вопроса, потому что ОП, похоже, знает, что не так, а что правильно, но хочет ошибаться.
@ 463035818_is_not_an_ai, я думаю, автор вопроса просто хочет знать, почему его/ее метод не работает. Так ли плохо быть любопытным?
«Я новичок в C++ и столкнулся с проблемой: я пытаюсь использовать ключевое слово delete». Это ваша проблема. new
и delete
— тема для продвинутых. Если кто-то претендует научить вас C++ и начинает с владения необработанными указателями, он оказывает вам медвежью услугу.
@SPGC Я никого не сужу. Тем более не из-за любопытства. Вопрос можно было бы сформулировать лучше. И когда я замечаю это, я упоминаю об этом. Судите меня за это :П
@ 463035818_is_not_an_ai, нет, я не буду этого делать) только зачем закрывать вопрос до того, как на него будет получен ответ, даже если вопрос плохо сформулирован?
@SPGC, потому что мы пытаемся сделать SO местом с хорошими вопросами и хорошими ответами. Заключительные вопросы – не оскорбление, а необходимость
@463035818_is_not_an_ai, ну ИМХО, именно поэтому новички предпочитают использовать чатgpt или copilot, там они получат ответ (в основном говно, но обычно их это устраивает), здесь они обычно получают много комментариев по поводу "плохая структура, нет выходов" и т. д.» и нет ответа...
@SPGC, они получили ответ, нет?
@ 463035818_is_not_an_ai, да, но не всегда они это понимают, и закрытие вопросов с ИМХО, возможно, плохой формулировкой без ответов, здесь является обычной практикой. Это моя точка зрения
Давайте продолжим обсуждение в чате.
К сожалению, метод, который вы хотите использовать, недопустим в C++.
Вам нужно использовать delete
, чтобы освободить память для объекта, созданного с помощью new
, и delete[]
, чтобы освободить память для массива, созданного с помощью new[]
. Простая мнемоника - для каждого new
один delete
, для каждого new[]
один delete[]
.
Причина этого в том, что когда вы создаете что-то с помощью new
или new[]
, вы выделяете немного больше памяти, чем ожидаете, дополнительная память выделяется для технической информации для оператора delete
или delete[]
. Эта информация указывает объем памяти, который был выделен и который должен быть позже удален с помощью оператора delete
или delete[]
. А когда вы используете delete
для каждого элемента массива, выделенного с помощью new[]
, оператор delete
ищет техническую информацию не в том месте, и это может привести к неопределенному поведению.
Это простое объяснение, для более точного советую вам посмотреть на cppreference.com, но для начала я считаю, что этого объяснения достаточно.
Каждый
delete
должен соответствоватьnew
, который использовался для выделения памяти. У вас есть одинnew[]
, который нужно создатьinstance
, но затем попробуйте вызвать 3delete
, чтобы удалить его — это не сработает.delete[] instance
вне любого цикла — единственный разрешенный способ освободитьinstance
.