小编Adr*_*thy的帖子

malloc失败后没有自由成功

我写了一个小程序来粗略估计堆大小(我知道我可能只是用谷歌搜索它,但这似乎更有趣,我认为这将是一个简单的事情).

这是整个计划:

#include <stdio.h>
#include <stdlib.h>

void main()
{
    unsigned long long alloc_size = 1024;
    unsigned long long total = 0;
    unsigned int i = 0;
    void* p = 0;

    while(alloc_size >= 16) {
        p = malloc(alloc_size);
        if (p) {
            total += alloc_size;
            i++;
            printf("%u)\tAllocated %llu bytes\tTotal so far %llu\n", i, alloc_size, total);
            alloc_size *= 2;
        }
        else {
            alloc_size /= 2;
        }
    }
    printf("Total alloctions: %llu bytes in %u allocations", total, i);
}
Run Code Online (Sandbox Code Playgroud)

我跑了这个,惊讶于两件事:

  1. 结果不一致.如果我多次运行它,我得不到完全相同的结果.由于虚拟内存模型(或任何它被称为),这不应该是确定性的吗?
  2. 由于程序永远不会释放内存,我希望如果某个大小的malloc失败一次,它不会在以后突然成功,但是 - 惊喜!这是一个程序运行的示例,其他时候我得到了不同(见#1),但结果相似:
42) …
Run Code Online (Sandbox Code Playgroud)

c malloc memory-management

7
推荐指数
1
解决办法
147
查看次数

How does including gtest.h break template argument deduction for a std algorithm?

I upgraded to the latest release of Google Test, and several of my tests no longer compiled. I've reduced it to this:

#include <gtest/gtest.h>

#include <algorithm>
#include <cctype>
#include <iostream>
#include <string>

int main () {
    const std::string foo = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    const auto uppers = std::count_if(foo.begin(), foo.end(), std::isupper);
    std::cout << "There are " << uppers << " capitals." << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

The Visual Studio 2019 (16.10.4) compiler with /std:c++latest complains:

1>Source.cpp(10,30): error C2672: 'std::count_if': no matching overloaded function …
Run Code Online (Sandbox Code Playgroud)

c++ googletest template-argument-deduction

7
推荐指数
1
解决办法
59
查看次数

比无限循环+阻止更好的游戏循环?

每个游戏教程和游戏框架(甚至是相当新的XNA框架)都从一个永无止境的循环开始,该循环具有等效的DoEvents()以防止操作系统被锁定.

从非游戏角度来看,我觉得这种代码闻起来很时髦.
没有更好的选择吗?

--EDIT--
很多答案说每个程序基本上都是一个循环.没错,但我觉得循环应该由您的操作系统执行,而不是由您执行.只有操作系统具有以最佳方式分配其资源所需的所有信息.或者我在这里错过了一个重点?

language-agnostic

6
推荐指数
1
解决办法
2761
查看次数

ISampleGrabber已被弃用?

我有一个旧的计算机视觉实验,它使用Video for Windows从连接到PC的相机中抓取帧.这是一个黑客,它使用VfW创建一个预览窗口,然后它从窗口DC执行GetDIBits.

我终于准备将它移植到DirectShow了.我的理解是我可以使用ISampleGrabber从视频捕获图中获取帧,但现在我读到了不推荐使用ISampleGrabber.

从视频Feed中抓取帧的非弃用方式是什么?我是否必须实现自己的DirectShow过滤器,它基本上与ISampleGrabber的功能相同?

winapi directshow vfw computer-vision

6
推荐指数
2
解决办法
2501
查看次数

(WiX)将同一文件安装到多个位置

对于我的产品中的多个文件,我需要在安装时将它们复制到两个不同的目标.例如:

C:\Program Files (x86)\My Company\My App\foo\xyzzy.txt
C:\Program Files (x86)\My Company\My App\bar\xyzzy.txt
Run Code Online (Sandbox Code Playgroud)

这两个xyzzy.txt副本是相同的.

我不希望在机柜中使用相同的文件副本.使用makecab,似乎在驾驶室中有重复的文件副本有效地使驾驶室的大小翻倍.相比之下,7zip设法包含第二个副本,几乎没有任何成本.

是否可以在(嵌入式)机柜中拥有每个文件的一个副本并将其安装到两个不同的目的地?如果是这样,你会如何在WiX 3.5中指定?

我假设有两个具有相同Id的File元素会违反XML的规则和/或WiX组件规则.另一方面,如果我有独特的文件元素,那么光会简单地将同一文件的两个副本放在机柜中吗?

wix wix3.5

6
推荐指数
1
解决办法
3993
查看次数

如何创建允许语法错误的AST解析器?

首先,阅读有关解析和构建AST的内容?

如何为将构建AST并允许语法错误的语言(如SQL)创建解析器?

例如,对于"3 + 4*5":

  +
 / \
3   *
   / \
  4   5
Run Code Online (Sandbox Code Playgroud)

对于语法错误的"3 + 4*+",解析器会猜测用户的意思是:

  +
 / \
3   *
   / \
  4   +
     / \
    ?   ?
Run Code Online (Sandbox Code Playgroud)

从哪儿开始?

SQL:

    SELECT_________________
   /           \           \
  .           FROM        JOIN
 / \           |         /    \
a city_name  people   address  ON
                                |
                                =______________
                               /               \
                              .____             .
                             /     \           / \
                            p  address_id     a  id
Run Code Online (Sandbox Code Playgroud)

language-agnostic compiler-construction algorithm abstract-syntax-tree

6
推荐指数
1
解决办法
1551
查看次数

从成员函数指针获取方法的返回类型

我试图声明一个变量,使其类型与我有成员函数指针的成员函数的返回类型相同.

class Widget {
    public:
        std::chrono::milliseconds Foo();
};
Run Code Online (Sandbox Code Playgroud)

例如,给定一个成员函数的指针fn,它指向Widget::Foo的,我怎么会声明一个变量blah,使得它得到Widget::Foo的返回类型(std::chrono::milliseconds)?

我发现从使用博客中的一些有前途的指导result_of,从<type_traits>沿decltype,但我似乎无法得到它的工作.

auto fn = &Widget::Foo;
Widget w;
std::result_of<decltype((w.*fn)())>::type blah;
Run Code Online (Sandbox Code Playgroud)

这种方法对我有意义,但VC++ 2013不喜欢它.

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xrefwrap(58): error C2064: term does not evaluate to a function taking 0 arguments
      C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xrefwrap(118) : see reference to class template instantiation 'std::_Result_of<_Fty,>' being compiled
      with
      [
          _Fty=std::chrono::milliseconds (__cdecl Widget::* )(void)
      ]
      scratch.cpp(24) : see …
Run Code Online (Sandbox Code Playgroud)

c++ member-function-pointers decltype type-traits

6
推荐指数
1
解决办法
5570
查看次数

CreateProcess 带有新的控制台窗口,但会覆盖一些 std i/o 句柄

如果您使用带有 CREATE_NEW_CONSOLE 标志的 CreateProcess,则新进程会将其标准输入、输出和错误句柄定向到新控制台窗口。如果要覆盖 I/O 流,可以通过设置 STARTUPINFO 字段 hStdOutput、hStdInput 和 hStdError 中的句柄并设置标志 STARTF_USESTDHANDLES 来实现。

但是如果您只想覆盖一个句柄怎么办?例如,我可能希望将 stderr 重定向到一个文件,同时将 stdout 和 stdin 连接到新的控制台窗口。

STARTF_USESTDHANDLES 标志告诉 CreateProcess 替换所有句柄,而不是将它们连接到新控制台窗口的句柄。所以看起来我们必须提供所有三个句柄。显然我可以将 hStdError 设置为日志文件的句柄,但是 hStdInput 和 hStdOutput 应该使用什么值?

我尝试使用 NULL,它似乎适用于 Windows 8.1,但不适用于 Windows 7。

我还考虑过首先创建一个控制台窗口,然后使用新控制台窗口缓冲区的句柄调用 CreateProcess(并省略 CREATE_NEW_CONSOLE 标志)。不幸的是,父进程也是一个控制台应用程序,似乎一个控制台应用程序无法创建第二个控制台窗口。

c++ console winapi createprocess stdio

6
推荐指数
1
解决办法
4383
查看次数

划分大量的3D点数据

我需要分割一大堆3D点(使用C++).这些点作为二进制浮点数组存储在HDD上,文件通常大于10GB.我需要将集合划分为大小小于1GB的较小子集.子集中的点应该仍然具有相同的邻域,因为我需要对数据执行某些算法(例如,对象检测).

我以为我可以使用KD-Tree.但是,如果我无法将所有点加载到RAM中,如何有效地构建KD-Tree?也许我可以将文件映射为虚拟内存.然后我可以保存指向属于某个段的每个3D点的指针并将其存储在KD树的节点中.那会有用吗?还有其他想法吗?

谢谢您的帮助.我希望你能解决这个问题:D

c++ algorithm 3d kdtree

6
推荐指数
1
解决办法
407
查看次数

Ansi C - K&R的编程语言书 - 包含头文件

通过K&R ansi C编程语言书(第二版),第82页,给出了编程文件/文件夹布局的示例.

版权所有K&R  -  C编程语言 -  Ansi C第二版

我不明白的是,虽然calc.h被列入main(使用功能),getop.c(getop的定义)和stack.c(push和pop的定义),它不会纳入getch.c,即使getchungetch被定义在那里.

c kernighan-and-ritchie

6
推荐指数
1
解决办法
527
查看次数