Я нажимаю кнопку "Назад", программа может получить обычный путь, но когда я снова нажимаю кнопку "Назад", возникает ошибка. я не знаю, проблема с памятью - PullRequest
0 голосов
/ 13 июля 2020

Я нажимаю кнопку «Назад», программа может получить обычный путь, но когда я снова нажимаю кнопку «Назад», возникает ошибка. Я не знаю, проблема с памятью. Код для создания окна опускаю, при необходимости могу оформить. Может я новичок, код не очень лаконичный, подскажите, есть ли предложения по улучшению.

HWND BackButton;
std::string strFilePath = "C:\\Program Files (x86)\\360\\360DrvMgr\\config\\defaultskin\\*.*";  /* Initial path */
LPCSTR FilePath = strFilePath.c_str(); /* exchange to LPCSTR */

{

switch (message)
        {
        case WM_CREATE:
        {
            BackButton = CreateWindow(WC_BUTTON, "BACK", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 850, 235, 30, 30, hwnd, HMENU(BACK), AppInstance, NULL);  /*Create the BACK Button*/
        }
        break;

    case WM_COMMAND:
    {
        switch (LOWORD(wParam)) /* mouse event*/
        {

        case BACK: /* clik the BACK button*/
        {
            const char *pc = FilePath; /*Initial path*/
            char drive[_MAX_DRIVE];    /*_splitpath_s param*/
            char dir[_MAX_DIR];        /*_splitpath_s param*/
            char fname[_MAX_FNAME];    /*_splitpath_s param*/
            char ext[_MAX_EXT];
            char split[] = "\\";       /*_splitpath_s param*/
            char *p = NULL;            /*filter*/;
            int countSlantBar = 0;  
            std::string ReMakePath;   /* string fathe dir name*/
            std::string MakePath;     /* final full path */

            _splitpath_s(pc, drive, dir, fname, ext);
            int Sdir = strlen(dir);
            for (Sdir - 3; Sdir >= 0; Sdir--) /* when click the BACK button get the father dir name*/
            {   
                if (pc[Sdir] == *split)
                {
                    ReMakePath = ReMakePath + pc[Sdir];
                }
                if (countSlantBar == 1) {
                    break;
                }
                else
                {
                    ReMakePath = pc[Sdir] + ReMakePath;   /* save the fathe dir as string */
                }
            }
            std::string s = pc;
            int pos = s.find(ReMakePath);
            int n = ReMakePath.size();
            s = s.erase(pos, n);    /* cut the father dir name\\ and save *.* */
            LPCSTR Mpath = s.c_str();   
            SendMessage(ComBox, CB_ADDSTRING, 0, LPARAM(Mpath));
            FilePath = Mpath;  /* The location of the error */                                                   
            break;
        }
        return TRUE;
        } 
        break;

введите описание изображения здесь

1 Ответ

2 голосов
/ 14 июля 2020

FilePath - это необработанный указатель const char*.

После нажатия кнопки Back вы устанавливаете FilePath на указатель, возвращаемый s.c_str(), но s является локальная переменная, которая уничтожается, когда ваш обработчик WM_COMMAND завершает работу, в результате чего FilePath остается висящим, указывая на освобожденную память.

Вам нужно изменить FilePath на std::string или, по крайней мере, Массив фиксированной длины char[], так что любые назначенные ему данные сохранятся после нескольких нажатий кнопки Back. Или, по крайней мере, введите отдельный постоянный std::string / char[] для FilePath, чтобы указать на.

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