我将minidump文件加载到Visual Studio 2010中,从我的程序文件夹和Microsoft Symbol Server加载所有符号,然后我选择"仅调试本机",程序运行到崩溃的地方,显示的错误与显示的相同. exe崩溃时远程计算机.
现在出现错误"找不到program.exe",并且在minidump中找不到"program.exe.您需要加载二进制文件才能找到当前堆栈帧的源代码"
当我点击"浏览并找到program.exe"时,我选择它但VS不会打开它?
我编译的EXE不断崩溃.崩溃时,我在事件查看器中有以下信息:
异常代码:0xc0000008
故障偏移:0x00000000000cb8e8
如何将"故障偏移"与我的C++代码相匹配?.PDBRelease文件夹中有一个文件,只是不确定要解决这个问题的步骤.
这是我的代码.
DWORD *dwDSE = new DWORD[4096];
Run Code Online (Sandbox Code Playgroud)
这是我清除它的[低效]方式:
for (INT k=0;k<4096;k++)
dwDSE[k] = 0;
Run Code Online (Sandbox Code Playgroud)
清除它/将其初始化为零的最佳方法是什么?
两个问题:
代码:
struct sComputerNames
{
TCHAR *sName; // Using a pointer here to minimize stack memory.
};
TCHAR *sComputer = (TCHAR *) calloc(2048+1, sizeof(TCHAR));
struct sComputerNames sCN[4096] = {0};
_tcscpy(sComputer,L"PC1");
sCN[0].sName = (TCHAR *) calloc(128,sizeof(TCHAR));
_tcscpy_s(sCN[0].sName,128,sComputer);
// What is a better way to clear out the structure array?
for (DWORD i=0;i<4096;i++)
{
free(sCN[i].sName);
sCN[i].sName=NULL;
}
// Assign a new value
_tcscpy(sComputer,L"PC2");
sCN[0].sName = (TCHAR *) calloc(128,sizeof(TCHAR));
_tcscpy_s(sCN[0].sName,128,sComputer);
free(sCN);sCN=NULL; // Erroring here - how to free memory allocated by …Run Code Online (Sandbox Code Playgroud) 这是我的代码,我想将字符串中的一个字符转换为大写。
TCHAR sPassword[16] = L"password";
INT iChar = toupper(sPassword[4]);
sPassword[4] = iChar;
Run Code Online (Sandbox Code Playgroud)
它运行正常,但我收到警告:
warning C4244: '=': conversion from 'int' to '_Ty', possible loss of data
Run Code Online (Sandbox Code Playgroud)
我试过铸造iChar,(INT)但没有任何区别。
这是我在进行 Visual Studio 2019 代码分析后得到的代码(警告 C26409 避免显式调用 new 和 delete,请使用 std::make_unique (r.11)。):
#include <windows.h>
#include <strsafe.h>
int main()
{
auto *sResult = new WCHAR[256];
StringCchPrintfW(sResult, 256, L"this is a %s", L"test");
delete[] sResult;
}
Run Code Online (Sandbox Code Playgroud)
我原本假设使用 new/delete 而不是 calloc/free,但现在编译器告诉我使用 std::make_unique。我找不到任何有关如何更改代码以使其兼容的示例。
所以我的问题是:
如何更改我的代码,使其不使用 new/delete
为什么我不应该使用 new/delte 与 std::make_unique ?
如果我使用 , 创建一个线程_beginthreadex,并且在我使用的线程中std::vector<WCHAR>消耗 200MB 内存 - 当线程结束时,内存不会被释放。即使之后CloseHandle,内存也不会被释放。
这是一个工作示例:
#include <windows.h>
#include <process.h>
#include <vector>
using namespace std;
unsigned __stdcall Thread_RestartComputer(void* pComputerName)
{
std::vector<WCHAR> asdf(100000000);
_endthreadex(0);
return 0;
}
int main()
{
UINT threadID = 0;
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &Thread_RestartComputer, 0, CREATE_SUSPENDED, &threadID);
ResumeThread(hThread);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
}
Run Code Online (Sandbox Code Playgroud)
我认为当std::vector<WCHAR>它超出范围时释放内存?
试图找到释放内存的正确方法,但我找不到确切的答案。我确定它在那里,但是我似乎找不到它,我有点困惑。
这就是我在做什么。我从sUsers创建一个新的sStructUsers,然后为用户名分配内存
struct sStructUsers
{
TCHAR *sName;
};
sStructUsers *sUsers = new sStructUsers[TOTALUSERS]();
// Allocate memory for the TCHARs in sStruct
for (INT k = 0; k < TOTALUSERS; k++)
{
sUsers [k].sName = (TCHAR*)calloc(128,sizeof(TCHAR))
}
Run Code Online (Sandbox Code Playgroud)
接下来,我需要对sName成员进行任何工作
// do work here
Run Code Online (Sandbox Code Playgroud)
现在,要执行清理操作:
delete[] sUsers;
Run Code Online (Sandbox Code Playgroud)
还是我这样做?
for (INT k = 0; k < TOTALUSERS; k++)
{
free(sUsers[k].sName);
}
delete[] sUsers?
Run Code Online (Sandbox Code Playgroud)
我不确定是否需要释放内存,或者delete []是否可以处理?