Работа с памятью. Помогите, пожалуйста
Всем здравствуйте. Совершенно недавно начал программирование на С++. В данном ниже коде есть массивы answer_for_yes и answer_for_no. Меня очень смущает то, что они будут занимать память в коде до конца работы программы. Я пробовал new и delete, однако компилятор тогда воспринимает данные массивы как строки (что и логично, ведь это указатель на первый элемент, а не на массив), а не как массивы. А для данной функции in_array нужны лишь массивы. Может обратиться к malloc или calloc? Хотя скорее всего результат будет тот же. Помогите, пожалуйста.
#include <iostream>
#include <string>
#include <stdlib.h>
#include "Shotgun.h"
#include "Player.h"
#include "Item.h"
`
template<size_t N>
bool in_array(std::string(&array)[N], std::string str)
{
for (auto& i : array) if (i == str) return true;
return false;
}
`
int main()
{
setlocale(LC_ALL, "RU");
std::cout << "Are you ready (yes - y, no - n) : ";
std::string* answer = new std::string;
std::string answer_for_yes[] { "YES", "Yes", "yes", "y" };
std::string answer_for_no[] { "NO", "No", "no", "n" };
while (true)
{
std::cin >> *answer;
if (in_array(answer_for_yes, *answer)) break;
else if (in_array(answer_for_no, *answer)) exit(0);
else std::cout << "Again: ";
}
delete answer;
std::string* name1 = new std::string;
std::string* name2 = new std::string;
// что-то ещё
delete name1;
delete name2;
return 0;
}
Ответы (1 шт):
Во-первых, при таких количествах беспокоиться о перерасхода памяти просто бессмысленно.
Во-вторых, все можно, но все имеет своим плюсы и минусы. Например, можно написать
std::string *answer_for_yes = new std::string[4]{ "YES", "Yes", "yes", "y" };
std::string *answer_for_no = new std::string[4] { "NO", "No", "no", "n" };
только вот теперь надо бы дописать освобождение памяти (a la delete[]answer_for_yes), да и ваша функция in_array при этом работать не будет, надо будет передавать в нее std::string *array и size_t N...
Тогда уж проще использовать
std::vector<std::string> answer_for_yes{ "YES", "Yes", "yes", "y" };
std::vector<std::string> answer_for_no{ "NO", "No", "no", "n" };
и соответственно переписать in_array, как
bool in_array(const std::vector<std::string>&array, const std::string& str)
или воспользоваться алгоритмом стандартной библиотеки типа find.