Ошибка отладки: стек вокруг переменной 'cardDesc' поврежден - PullRequest
0 голосов
/ 22 ноября 2018

TITLE.Я использую следующую функцию:

void GetVideoCardInfo(int* memoryVar, char* cardName)
{
    strcpy_s(cardName, 128, m_videoCardDescription);
    *memoryVar = m_videoCardMemory;
    return;
}

m_videoCardDescription - массив символов длиной 128 символов, в котором содержится описание моей видеокарты.Вот где я вызываю функцию:

bool writeGPUnameDesc() {
    char cardDesc;
    int cardMem;
    m_D3D->GetVideoCardInfo(&cardMem, &cardDesc);

    std::ofstream myfile;
    myfile.open("gpuNameAndDesc.txt");
    myfile << "Graphics card name: " << cardDesc;
    myfile << " - Graphics card memory: " << cardMem;
    myfile.close();

    return true;
}

Когда я запускаю программу, появляется окно с сообщением об ошибке проверки выполнения №2 и заголовком.Если кто-то может помочь, спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

TL; DR

std::string GetVideoCardInfo(int & memoryVar)
{
    memoryVar = m_videoCardMemory;
    return m_videoCardDescription;;
}


bool writeGPUnameDesc() {
    int cardMem;
    std::string cardDesc = m_D3D->GetVideoCardInfo(cardMem); 

    std::ofstream myfile;
    myfile.open("gpuNameAndDesc.txt");
    myfile << "Graphics card name: " << cardDesc;
    myfile << " - Graphics card memory: " << cardMem;
    myfile.close();

    return true;
}

Объяснение

strcpy_s(cardName, 128, m_videoCardDescription);

- вопиющая ложь.Размер cardName составляет ровно один символ.Если вы врете strcpy_s, то дополнительная проверка, чтобы убедиться, что буфер не переполнен, вам не поможет.

Низшие решения

Замените

char cardDesc;   

на

char cardDesc[129]; 

Более эффективный подход полностью избавляет от магических чисел .

В верхней части файла

namespace // annonymous namespace. Contents will not leak out of the file
{
    constexpr int MAX_CARD_NAME_LENGTH = 129 // 128 plus room for nul terminator
}

, а затем

void GetVideoCardInfo(int* memoryVar, char* cardName)
{
    strcpy_s(cardName, MAX_CARD_NAME_LENGTH, m_videoCardDescription);
    *memoryVar = m_videoCardMemory;
    return;
}

и

bool writeGPUnameDesc() {
    char cardDesc[MAX_CARD_NAME_LENGTH]; // now an array
    int cardMem;
    m_D3D->GetVideoCardInfo(&cardMem, cardDesc); // don't need to take address of array

    std::ofstream myfile;
    myfile.open("gpuNameAndDesc.txt");
    myfile << "Graphics card name: " << cardDesc;
    myfile << " - Graphics card memory: " << cardMem;
    myfile.close();

    return true;
}
0 голосов
/ 22 ноября 2018

Вы копируете 128 символов в char cardDesc, что соответствует только 1 символу.

Вы должны изменить тип cardDesc на массив символов:

char cardDesc[128];
// ...
m_D3D->GetVideoCardInfo(&cardMem, cardDesc);
//                                ^ no &
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...