小编Kel*_*ang的帖子

为什么std :: map的move构造函数不是noexcept?

正如cppreference.com所说,

地图通常以红黑树的形式实现。

因此,移动a std::map只是将指针移动到根node+其他信息(例如大小)。为什么std::map移动构造函数未标记为noexcept

c++ move-semantics

12
推荐指数
1
解决办法
301
查看次数

链接到ntdll.lib并调用ntdll.dll内部的函数

我最近正在对私有 API 进行一些研究。我尝试在运行时使用和调用诸如NtOpenFilentdll.dll 中的函数。幸运的是,它成功了。今天早上我在我的电脑上进行了文件搜索,并在我的C盘中找到了。据我所知,这样的 .lib 文件应该包含可用于链接的 dll 导出存根。因此,我尝试将我的应用程序链接到该库,但我不断收到错误。然而,a显示ntdll.lib显然导出了NtOpenFile。我该如何解决这个错误?LoadLibraryGetProcAddressntdll.libunresolved external symboldumpbin /EXPORTS

c dll window visual-studio

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

std :: vector如何破坏它的对象?

为了练习,我正在尝试实现自己的std :: vector.当前源代码:http://pastebin.com/bE4kjzcb


这是我班级的概要:

  1. Array() 使用分配一些内存 malloc()
  2. push_back(const T &t)添加一个元素,realloc()必要时调用.
  3. ~Array()打电话free()给释放记忆.

这个模型的主要问题是,free()回收内存,但它不会调用T析构函数(何时T是类而不是标准数据类型).

当向量内的元素是对象时,这可能导致严重的资源泄漏.我解决这个问题的方法是,在内存之前调用~T() EXPLICITLYfree().

我正在使用的原因malloc()是,我正在努力利用realloc().如果我使用newdelete,重新分配时内存使用率将达到峰值.(新缓冲区和旧缓冲区都存在的时刻.)

问:这是一个糟糕的设计吗?怎么std::vector解决这个问题?我的矢量类中还有其他缺陷吗?

PS:我们暂不谈malloc()现在的多线程表现.

c++ memory-management vector

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

如果调用堆栈向上增长会使缓冲区溢出更安全吗?

每个线程都有自己的堆栈来存储局部变量.但是堆栈也用于在调用函数时存储返回地址.

在x86程序esp集中,指向最近分配的堆栈末尾.今天,大多数CPU的堆栈增长都是负面的.此行为通过溢出缓冲区并覆盖保存的返回地址来启用任意代码执行.如果堆栈要积极增长,这种攻击是不可行的.

使调用堆栈向上增长更安全吗?为什么英特尔设计8086随着堆栈的增长而下降?他们可以在任何后来的CPU中改变一些东西,让现代x86的堆栈向上增长吗?

x86 assembly stack intel buffer-overflow

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

Visual C++中的CreateWindow()始终返回null

这是我的代码,在WinMain入口点我注册了一个类并尝试创建一个窗口,但CreateWindow()函数总是返回NULL.但是RegisterClass()函数确实成功了.我做错了什么?

#include <Windows.h>
#include <stdio.h>


LRESULT CALLBACK event(HWND, UINT, WPARAM, LPARAM)
{


    return 0;
}

int CALLBACK WinMain(
    _In_ HINSTANCE hInstance,
    _In_ HINSTANCE hPrevInstance,
    _In_ LPSTR     lpCmdLine,
    _In_ int       nCmdShow
    )
{
    WNDCLASS wndClass;
    wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndClass.hInstance = hInstance;
    wndClass.lpszMenuName = NULL;
    wndClass.lpfnWndProc = event;
    wndClass.lpszClassName = L"ME";
    wndClass.cbClsExtra = 0;
    wndClass.cbWndExtra = 0;
    wndClass.style = CS_HREDRAW | CS_VREDRAW;

    int err = RegisterClass(&wndClass);
    if (err < 0)
    {
        MessageBox(NULL, L"Can not …
Run Code Online (Sandbox Code Playgroud)

c++ visual-c++-2012

4
推荐指数
1
解决办法
1035
查看次数

打开/关闭手柄时会发生什么?

我被介绍给C++.我对"处理"的想法感到困惑这是我今天写的一个小片段:

    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, a valid pid);
    printf("%d", hProcess);
Run Code Online (Sandbox Code Playgroud)

我发现每次输出都是"48".这是有道理的,因为句柄是数组索引等资源的标识符.但即使我用其他标志替换PROCESS_ALL_ACCESS,返回值仍然相同.打开手柄时到底发生了什么?操作系统如何知道句柄的访问权限?如果句柄是资源的标识符,为什么以下代码不起作用?

    HANDLE hProces = 48;
Run Code Online (Sandbox Code Playgroud)

此外,当您调用CloseHandle(hProcess)时发生了什么?为什么输出仍然是48?

    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, a valid pid);
    CloseHandle(hProcess);
    printf("%d\n", hProcess);
Run Code Online (Sandbox Code Playgroud)

c++ winapi handle visual-c++

3
推荐指数
1
解决办法
926
查看次数

为什么哈希算法可以安全使用?

今天的哈希算法被广泛用于检查数据的完整性,但为什么它们可以安全使用?256位散列算法生成给定数据的256位表示.但是,256位散列只有2 512个变体.但1 KB的数据有2 8192种不同的变化.从数学上讲,世界上每一块数据都不可能有不同的哈希值.那么哈希算法为何安全?

security algorithm hash

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