sizeof(this->info_pcName)
дает размер char*
(вероятно, 4 или 8 в вашей системе), а не длину вашего массива. Следующее должно работать:
char* sample::get_info_pcName()
{
if (info_pcName)
return info_pcName;
DWORD nComputerName = MAX_COMPUTERNAME_LENGTH + 1;
info_pcName = new char[nComputerName];
if (!GetComputerName(info_pcName, &nComputerName))
info_pcName = "error";
return info_pcName;
}
Кроме того, плохой практикой является использование сырых указателей таким способом. Я бы порекомендовал следующее вместо этого для C ++ 03 (для C ++ 11 есть более подходящие подходы):
#include <cstring>
#include <vector>
#include <windows.h>
class sample
{
public:
char const* get_info_pcName();
private:
std::vector<char> info_pcName;
};
char const* sample::get_info_pcName()
{
if (!info_pcName.empty())
return &info_pcName[0];
DWORD nComputerName = MAX_COMPUTERNAME_LENGTH + 1;
info_pcName.resize(nComputerName);
if (!GetComputerName(&info_pcName[0], &nComputerName))
std::strcpy(&info_pcName[0], "error");
return &info_pcName[0];
}
Таким образом, вам не нужен рукописный конструктор или деструктор, а также рукописный конструктор копирования или оператор копирования (оба из которых в вашем классе неправильно отсутствуют, что может привести к повреждению памяти при любом обычном использовании).