小编sha*_*oth的帖子

我可以在C++中撤消"using namespace"的效果吗?

using namespace不使用命名空间限定符的情况下,我可以直接看到该命名空间的全部内容.如果using namespace在广泛使用的头文件中发生这可能会导致问题- 我们可能无意中使两个具有相同类名称的名称空间可见,并且编译器将拒绝编译,除非类名称前缀为名称空间限定符.

我可以撤消,using namespace以便编译器忘记它之前看到它吗?

c++ namespaces using

31
推荐指数
3
解决办法
5932
查看次数

即使进程正在运行,Process.HasExited也会返回true?

我一直在观察,即使进程仍在运行,Process.HasExited有时也会返回true.

我的代码在下面启动一个名为"testprogram.exe"的进程,然后等待它退出.问题是有时我会抛出异常; 似乎即使HasExited返回true过程本身在系统中仍然存在 - 这怎么可能?

我的程序在它终止之前写入日志文件,因此我需要在读取之前绝对确定该日志文件存在(也就是进程已终止/完成).不断检查它的存在不是一种选择.

// Create new process object
process = new Process();

// Setup event handlers
process.EnableRaisingEvents = true;
process.OutputDataReceived += OutputDataReceivedEvent;
process.ErrorDataReceived += ErrorDataReceivedEvent;
process.Exited += ProgramExitedEvent;

// Setup start info
ProcessStartInfo psi = new ProcessStartInfo
                           {
                               FileName = ExePath,
                               // Must be false to redirect IO
                               UseShellExecute = false,
                               RedirectStandardOutput = true,
                               RedirectStandardError = true,
                               Arguments = arguments
                           };

process.StartInfo = psi;

// Start the program
process.Start(); …
Run Code Online (Sandbox Code Playgroud)

c# process exit terminate

31
推荐指数
5
解决办法
3万
查看次数

如果我超载它,如何调用原始的"operator new"?

假设我需要重载全局::operator new() 以便为每个分配的对象存储额外的数据.所以基本上它会这样工作:

  • 对于每次调用global ::operator new(),它将传递对象大小并添加额外数据的大小
  • 它将分配一个在前一步推导出的大小的内存块
  • 它会将指针偏移到未被额外数据占用的块部分,并将该偏移值返回给调用者

::operator delete() 反向移动指针,访问额外数据,释放内存.

现在的问题是如何分配内存?当然我可以调用malloc()或者某些特定于平台的功能(通常是这样做的).但通常当我需要在C++中分配原始内存时,我会调用::operator new().我可以调用原始文件::operator new()从我重载的全局内部进行内存分配::operator new()吗?

c++ memory memory-management operator-overloading

29
推荐指数
1
解决办法
4904
查看次数

具有"箭头"的C#代码是什么意思,它是如何调用的?

我试图在我的C#客户端程序中启用SSL,并在此答案中找到以下代码:

System.Net.ServicePointManager.ServerCertificateValidationCallback +=
    (se, cert, chain, sslerror) =>
    {
        return true;
    };
Run Code Online (Sandbox Code Playgroud)

我将代码添加到我的程序中它解决了问题,但我完全不知道它是如何工作的.

左边部分System.Net.ServicePointManager.ServerCertificateValidationCallback是一些回调并+=修改了回调.但剩下的构造意味着什么呢?我花了20分钟搜索至少找到它是如何正确调用的,在哪里我可以找到更多关于如何阅读的信息,但都是徒劳的.我想它与LINQ有某种关联并搜索"LINQ箭头",但没有找到任何合理的东西.

如何(blah,blah,blah)=>{return true;}调用该构造,在哪里可以找到有关此类构造的更多信息?

.net c# linq

29
推荐指数
4
解决办法
4万
查看次数

什么流导致Github提交由一个用户"创作"但由另一个用户"提交"?

例如,这次提交声称要由创作mattcaswell并致力于richsalz

在此输入图像描述

什么样的使用流程可能导致这个?假设我想要一个由其他人创作并由我承诺出现在我是贡献者的回购中的提交 - 我怎么会这样做?

commit github git-commit

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

我应该使用return/continue语句而不是if-else吗?

在C,C++和C#使用条件时函数或循环语句中有可能使用继续返回尽早声明,摆脱了其他的分支的if-else语句.例如:

while( loopCondition ) {
    if( innerCondition ) {
        //do some stuff
    } else {
        //do other stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

 while( loopCondition ) {
    if( innerCondition ) {
        //do some stuff
        continue;
    }
    //do other stuff
}
Run Code Online (Sandbox Code Playgroud)

void function() {
    if( condition ) {
        //do some stuff
    } else {
        //do other stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

void function() {
    if( condition ) {
        //do some stuff
        return;
    }
    //do other …
Run Code Online (Sandbox Code Playgroud)

c c# c++

28
推荐指数
7
解决办法
2万
查看次数

exec()更改程序映像后malloc的内存会发生什么?

我知道当我exec()在Linux中调用其中一个系统调用时,它将使用新映像替换当前正在运行的进程.因此,当我分叉一个新进程并运行时exec(),子进程将被替换为新进程.

我从堆中分配的内存会发生什么变化?假设我想解析任意数量的命令并将其发送到exec().为了保持这个任意数字,我可能不得不在某个时刻分配内存,因为我认为我不能正确使用静态大小的数组,所以我可能会使用malloc()或等效的东西.

我需要保持这个内存分配,直到我打电话exec(),但exec()永远不会返回.

内存是否被操作系统回收?

c c++ memory-management exec

28
推荐指数
2
解决办法
7484
查看次数

是否有可能保证在C++中没有优化代码执行内存写入?

允许C++编译器优化写入内存:

 {
     //all this code can be eliminated
     char buffer[size];
     std::fill_n( buffer, size, 0);
 }
Run Code Online (Sandbox Code Playgroud)

处理敏感数据时,典型方法是使用volatile*指针来确保编译器发出内存写入.以下是SecureZeroMemory()Visual C++运行时库中的函数实现方式(WinNT.h):

FORCEINLINE PVOID RtlSecureZeroMemory(
     __in_bcount(cnt) PVOID ptr, __in SIZE_T cnt )
{
    volatile char *vptr = (volatile char *)ptr;
#if defined(_M_AMD64)
    __stosb((PBYTE )((DWORD64)vptr), 0, cnt);
#else
    while (cnt) {
        *vptr = 0;
        vptr++;
        cnt--;
    }
#endif
    return ptr;
}
Run Code Online (Sandbox Code Playgroud)

该函数将传递的指针强制转换为volatile*指针,然后通过后者写入.但是,如果我在局部变量上使用它:

char buffer[size];
SecureZeroMemory( buffer, size );
Run Code Online (Sandbox Code Playgroud)

变量本身不是volatile.因此根据C++标准定义的可观察行为写入buffer不计入可观察行为,看起来它可以被优化掉.

现在有很多关于页面文件,缓存等的评论都是有效的,但是我们在这个问题中忽略它们.这个问题唯一的问题是存储器写入的代码是否被优化掉了.

是否有可能确保在C++中没有优化写入内存的代码?该解决方案SecureZeroMemory()是否符合C++标准?

c++ compiler-construction optimization compiler-optimization

28
推荐指数
1
解决办法
1493
查看次数

电子邮件混淆真的会让自动收获变得更难吗?

许多用户和论坛程序试图通过混淆使自动电子邮件地址变得更加困难 - @被替换为"at"和.被替换为"点",所以

 team@stackoverflow.com
Run Code Online (Sandbox Code Playgroud)

现在变成了

team at stackoverflow dot com
Run Code Online (Sandbox Code Playgroud)

我不是正则表达式的专家而且我真的很好奇 - 这种混淆真的让自动收获更难吗?是否真的难以自动识别这些混淆的地址?

language-agnostic obfuscation email-address

27
推荐指数
5
解决办法
2412
查看次数

为什么我不应该在"删除"之后尝试使用"this"值?

C++的这一段中,delete this讨论了构造的使用.列出了4个限制.

限制1到3看起来很合理.但是为什么限制4在那里我"必须不检查它,将它与另一个指针进行比较,将它与NULL进行比较,打印它,投射它,用它做任何事情"?

我的意思this是又一个指针.为什么我不能把reinterpret_castint或者叫它printf()输出它的值?

c++ undefined-behavior

27
推荐指数
3
解决办法
1927
查看次数