小编All*_*uer的帖子

是否有可能std :: move本地堆栈变量?

请考虑以下代码:

struct MyStruct
{
    int iInteger;
    string strString;
};

void MyFunc(vector<MyStruct>& vecStructs)
{
    MyStruct NewStruct = { 8, "Hello" };
    vecStructs.push_back(std::move(NewStruct));
}

int main()
{
    vector<MyStruct> vecStructs;
    MyFunc(vecStructs);
}
Run Code Online (Sandbox Code Playgroud)

为什么这样做?

在调用MyFunc时,返回地址应放在当前线程的堆栈上.现在创建NewStruct对象,它也应该被放置在堆栈上.使用std :: move,我告诉编译器,我不打算再使用NewStruct引用了.他可以偷走记忆.(push_back函数是具有移动语义的函数.)

但是当函数返回并且NewStruct超出范围时.即使编译器不会从堆栈中删除最初存在的结构所占用的内存,他至少也要删除先前存储的返回地址.

这将导致碎片堆栈,未来的分配将覆盖"移动"的内存.

有人可以向我解释一下吗?


编辑:首先:非常感谢您的回答.但是从我学到的东西,我仍然无法理解,为什么以下不能像我期望的那样工作:

struct MyStruct
{
    int iInteger;
    string strString;
    string strString2;
};

void MyFunc(vector<MyStruct>& vecStructs)
{
    MyStruct oNewStruct = { 8, "Hello", "Definetly more than 16 characters" };
    vecStructs.push_back(std::move(oNewStruct));

    // At this point, oNewStruct.String2 should be "", because its memory was stolen.
    // But only …
Run Code Online (Sandbox Code Playgroud)

c++ move move-semantics c++11

20
推荐指数
2
解决办法
1万
查看次数

为Windows服务设置事后调试程序

是否可以在崩溃时创建Windows服务的完整内存转储?显然,有一些众所周知的事后调试器,可以收集失败进程的内存转储.但Windows服务的问题在于它们是在系统上下文中运行而不是在用户上下文中运行.有谁能够帮我?

到现在为止,我尝试使用WinDbg:

  • 我通过执行WinDbg -I将WinDbg设置为默认的事后调试器.
  • 我验证了在注册表的两个位置(HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AeDebug和HKLM\SOFTWARE\Wow6432Node\Microsoft\WindowsNT\CurrentVersion\AeDebug),存在两个条目Auto和Debugger.
  • 我通过将调试器条目更改为"Path\WinDbg.exe"-p%ld -c".dump/ma/u D:\ CrashDump.dmp"-e%ld -g,将WinDbg配置为在启动时自动写入内存转储
  • 我验证了WinDbg具有内存转储文件的目标位置的权限,具有和不具有管理权限.

但它不起作用.:(

如果我编写一个普通的用户模式应用程序,它在启动后故意崩溃,WinDbg弹出并自动将.dmp文件写入目标位置.但如果我的服务崩溃,它就不会崩溃.在任务管理器中,我可以看到WinDbg在我的服务崩溃过程之后启动,但两者都只保留在列表中而没有任何转储文件.

debugging windbg postmortem-debugging

5
推荐指数
1
解决办法
2308
查看次数