小编Bil*_*eal的帖子

什么是内存泄漏?

显然,维基百科有关于该主题的大量信息,但我想确保我理解.从我可以告诉它的重要性来理解堆栈/堆关系真正了解内存泄漏?

所以这就是我(我想)的理解.更正是非常受欢迎的!

首次启动程序时,会分配一块内存,例如0x000到0xFFF.第一部分(比如0x000到0x011)是加载程序代码的代码/文本段.

+--------------+ 0x011
| Program Code |
+--------------+ 0x000
Run Code Online (Sandbox Code Playgroud)

然后你有堆栈(比如0x012到0x7ff)保存局部变量,它们被存储/检索FIFO.所以,如果你有类似的东西

char middleLetter(string word){
     int len = word.length();
     return word[len/2];
}

int main(){
   int cool_number;
   char letter;
   letter = middleLetter("Words");
   ...
Run Code Online (Sandbox Code Playgroud)

然后你的变量将被分配在堆栈上,如下所示:

+-------------+ 0x7ff
|             |
|             |
|             |
| ...         |
| len         |
| letter      |
| cool_number |
+-------------+ 0x012
Run Code Online (Sandbox Code Playgroud)

当然,如果你在某处(使用mallocnew)分配内存,但从不释放它,那么你的堆可能看起来像这样,你现在有内存泄漏:

+-------------+ 0xfff
|             |
| malloc(20)  | 0xf64
| malloc(50)  | 0xf32
| malloc(50)  | 0xf00
| ... …
Run Code Online (Sandbox Code Playgroud)

memory-leaks

25
推荐指数
3
解决办法
7937
查看次数

是否有特定原因在C++中不允许嵌套的命名空间声明?

该标准不允许这样的代码:

namespace Hello::World {

//Things that are in namespace Hello::World

}
Run Code Online (Sandbox Code Playgroud)

而是要求

namespace Hello { namespace World {

//Things that are in namespace Hello::World

}}
Run Code Online (Sandbox Code Playgroud)

理由是什么?这当时根本没有想到,还是有一个特定的原因不包括在内?

似乎第一个语法更直接地表达了应该在哪个命名空间中,因为声明模仿了以后代码中命名空间的实际使用.如果你不幸使用"哑"括号计算缩进工具,它也会减少缩进.

c++ namespaces language-design rationale

25
推荐指数
3
解决办法
5596
查看次数

为什么自下而上的解析比自上而下的解析更常见?

似乎递归下降解析器不仅是最简单的解释,而且最简单的设计和维护.它们不仅限于LALR(1)语法,并且代码本身可以被凡人理解.相比之下,自下而上的解析器对它们能够识别的语法有限制,并且需要由特殊工具生成(因为驱动它们的表几乎不可能手动生成).

那么为什么自下而上(即shift-reduce)解析比自上而下(即递归下降)解析更常见?

parsing context-free-grammar

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

如何在zip文件中找到"中央目录"的开头?

维基百科对ZIP文件格式有很好的描述,但"中心目录"结构让我感到困惑.特别是这个:

这种排序允许在一次传递中创建ZIP文件,但通常通过首先读取最后的中心目录来解压缩.

问题是即使中央目录的尾部标题也是可变长度.那么,有人可以得到解析中心目录的开头吗?

(哦,我确实花了一些时间看着APPNOTE.TXT,然后来到这里询问:P)

zip file-format

25
推荐指数
2
解决办法
7427
查看次数

我应该何时考虑仅限图书馆标题?

显然模板库只需要标题,但对于非模板,什么时候应该只使用标题?

c++ header-only

25
推荐指数
1
解决办法
1320
查看次数

当二元运算符两边的签名不同时,促销规则如何工作?

考虑以下程序:

// http://ideone.com/4I0dT
#include <limits>
#include <iostream>

int main()
{
    int max = std::numeric_limits<int>::max();
    unsigned int one = 1;
    unsigned int result = max + one;
    std::cout << result;
}
Run Code Online (Sandbox Code Playgroud)

// http://ideone.com/UBuFZ
#include <limits>
#include <iostream>

int main()
{
    unsigned int us = 42;
    int neg = -43;
    int result = us + neg;
    std::cout << result;
}
Run Code Online (Sandbox Code Playgroud)

+运算符如何"知道"返回哪个正确的类型?一般的规则是把所有的参数转换为最广泛的类型,但在这里没有明确的"赢家"之间intunsigned int.在第一种情况下,unsigned int必须选择作为结果operator+,因为我得到了结果2147483648.在第二种情况下,它必须选择int,因为我得到了结果-1.然而,在一般情况下,我没有看到这是如何可判定的.这是我看到的未定义的行为还是其他什么?

c++ arithmetic-expressions overflow integer-promotion

25
推荐指数
2
解决办法
8374
查看次数

如果我的编译器不支持它们,如何在C或C++中添加和减去128位整数?

我正在为128位数字的长流写一个压缩器.我想将数字存储为差异 - 仅存储数字之间的差异而不是数字本身,因为我可以将差异打包在更少的字节中,因为它们更小.

但是,对于压缩,我需要减去这些128位值,对于解压缩,我需要添加这些值.我的编译器的最大整数大小是64位宽.

任何人有任何想法有效地做到这一点?

c++ integer 128-bit

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

为什么有几个标准运算符没有标准仿函数?

我们有:

  • std::plus (+)
  • std::minus(-)
  • std::multiplies(*)
  • std::divides(/)
  • std::modulus(%)
  • std::negate(-)
  • std::logical_or(||)
  • std::logical_not(!)
  • std::logical_and(&&)
  • std::equal_to(==)
  • std::not_equal_to(!=)
  • std::less(<)
  • std::greater(>)
  • std::less_equal(<=)
  • std::greater_equal(>=)

我们没有仿函数:

  • & (地址)的
  • * (解引用)
  • []
  • ,
  • 位运算符~,&,|,^,<<,>> …

c++ stl functor

23
推荐指数
3
解决办法
1043
查看次数

如何使用完全不同的构建系统处理第三方库?

C++(和C,虽然它更重要)标准状态,程序中的所有翻译单元需要具有相同的定义; 这包括编译器开关之类的东西.例如,在MSVC++中,必须链接到C运行时库的正确版本(/MT/MD/MTd/MDd所有翻译单元).

但是,我们想要使用几个第三方依赖项,并且有几件事情:

  • 他们都使用不同的构建系统(有一个autoconf,有一个cmake,并且有一个似乎有它自己的手工卷制的东西..)
  • 构建系统并非都在其配置中公开这些类型的交换机,并且硬编码的交换机在不同的系统中设置不同.(例如,一个库的力量/MD/MDd,而另一种力量/MT/MTd)

我们不确定处理这类事情的最佳方法是什么.我们讨论了以下选项:

  • 围绕任何第三方依赖关系构建我们自己的构建系统.
    • PRO:我们知道事情会匹配
    • PRO:我们知道我们可以以正确的方式进行跨平台支持
    • CON:我们并不确切知道每个第三方构建系统是如何工作的
    • CON:很多很多工作
    • CON:如果第三方依赖关系发生更改,则会中断
  • 尝试使用第三方构建系统,并尝试修改它们以执行我们需要的操作.
    • PRO:似乎工作量减少了
    • CON:我们可能打破第三方系统
    • CON:如果第三方依赖关系发生更改,则会中断
    • CON:强迫我们自己的构建变得非常复杂

我们不知道该怎么办; 我们无法相信我们一个人就有这些问题.我们应该选择上述选项之一,还是我没想过的第三种选择?

c c++ dependencies build-dependencies

23
推荐指数
2
解决办法
1657
查看次数

为什么C#要求您在每次触发事件时都写一个空检查?

这对我来说似乎很奇怪 - VB.NET通过其RaiseEvent关键字隐式处理空检查.它似乎大大增加了围绕事件的样板数量,我看不出它提供了什么好处.

我确信语言设计师有充分的理由这样做..但我很好奇,如果有人知道为什么.

c# null events

21
推荐指数
4
解决办法
1558
查看次数