Почему от освобождения переменной ломается вывод?

#include <iostream>
#include <windows.h>
#include <vector>


bool str(std::vector<char*>& vector)
{
    char* name = (char*)malloc(MAX_PATH);
    if (name != 0) { ZeroMemory(name, MAX_PATH); };
    lstrcatA(name, "Name: ");
    lstrcatA(name, "Anastasya");
    lstrcatA(name, "\nFNAME: ");
    lstrcatA(name, "Belkova");
    vector.push_back(name);
    free(name);
    return 1;
}

int main()
{
    std::vector<char*> name;
    str(name);
    std::cout << name[0];
}

Если я пишу в функции str free(name) у меня вывод в консоли примерно такой

▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌

А если я убираю free(name) то выводит всё как надо. В чем ошибка и что я упустил?


Ответы (1 шт):

Автор решения: EOF

Дело в том, что указатели хранят только адрес. Вы выделяете память с помощью malloc и сохраняете адрес этой памяти в указателе в векторе и сразу освобождаете эту память. В результате в векторе находится указатель на память, которой Ваша программа уже не владеет. На момент вывода, этой памятью уже могла пользоваться другая программа, которая изменила её содержимое, что Вы и наблюдаете. В С++ есть класс std::string, который предназначен для работы со строками. Используйте его.

→ Ссылка