小编Bar*_*uch的帖子

应用程序内存泄漏是否会导致操作系统内存泄漏?

当我们说一个程序泄漏内存,说没有删除在C++中,它真的泄漏?我的意思是,当程序结束时,是否仍然将内存分配给某些非运行程序并且无法使用,或者操作系统是否知道每个程序请求的内存,并在程序结束时释放它?如果我多次运行该程序,我会耗尽内存吗?

operating-system memory-leaks

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

什么是理想的缓冲区大小?

可能重复:
使用FileInputStream时如何确定理想的缓冲区大小?

当使用C++的istream系列read()或C 语言从文件(或任何输入流)读取原始数据时fread(),必须提供缓冲区,以及要读取的数据量.我见过的大多数程序似乎都在512到4096之间任意选择2的幂.

  1. 它是否有/应该是2的幂的原因,或者这只是程序员对2的幂的自然倾向?
  2. 什么是"理想"数字?"理想"我的意思是它会是最快的.我假设它必须是底层设备的缓冲区大小的倍数?或者可能是底层流对象的缓冲区?无论如何,我如何确定这些缓冲区的大小?而且,一旦我这样做,使用它的倍数会增加任何速度,而不是使用确切的大小?

编辑
大多数答案似乎是在编译时无法确定.我很高兴在运行时找到它.

c c++ io

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

intptr_t有什么用?

我知道它是一个整数类型,可以在不丢失数据的情况下强制转换为指针,但为什么我要这样做呢?使用整数类型有什么优势void*可以保存指针和THE_REAL_TYPE*指针算术?

编辑
标记为"已被询问"的问题没有回答这个问题.问题是如果使用intptr_t作为一般的替换void*是一个好主意,那里的答案似乎是"不要使用intptr_t",所以我的问题仍然有效:什么是一个很好的用例intptr_t

c c++ pointers

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

C++中的私有与静态函数

在我的类中使用的实用程序函数在类中使用private(可能还有static)函数是否有任何优势,static在我的.cpp实现类的文件中使用全局函数不需要访问实例的数据?
第一个听起来更干净,但第二个真的更有意义,因为这些功能甚至不需要在.h文件中提及.

c++ static scope private class

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

将嵌套类导入名称空间 - C++

说我有这样一个类:

class A {
public:
    class B {
        // ...
    };
    static void f();
    // ...
};
Run Code Online (Sandbox Code Playgroud)

我可以引用Bas A::Bf()as A::f(),但是我可以导入Bf()进入global/current命名空间吗?我试过了

using A::B;
Run Code Online (Sandbox Code Playgroud)

但这给了我一个编译错误.

c++ namespaces

20
推荐指数
3
解决办法
6462
查看次数

C++ 11随机数

我需要生成随机数,但是从尽可能宽的范围(至少64位).我不在乎分配是否完美,所以std::rand()会起作用,但它只返回一个int.据我所知,c ++ 11具有一些随机数生成功能,可以提供任何大小的数字,但使用起来非常复杂.有人可以发布一个简单的例子,说明如何尽可能简单地使用它以尽可能简单的方式获得所描述的功能(64位或更多随机数)(比如std::rand())?

c++ random c++11

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

BASH重定向创建文件夹

我怎样才能拥有以下命令

echo "something" > "$f"
Run Code Online (Sandbox Code Playgroud)

如果不存在,$f将在哪里folder/file.txt创建文件夹folder

如果我不能这样做,我怎么能让脚本将目录'a'中的所有文件夹(没有内容)复制到目录'b'?

例如,如果我有

a/f1/
a/f2/
a/f3 /

我希望有

b/f1/
b/f2/
b/f3 /

bash

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

自动参考的类型

如果我有以下两个循环:

std::vector<int> v;

for(auto i : v)
  //do something with i

for(auto& j : v)
  //do something with j
Run Code Online (Sandbox Code Playgroud)

当我将鼠标悬停在上面时i,intellisense会将其显示为int i(如预期的那样).但是,当我将鼠标悬停在上面时,j我并没有int&像预期的那样得到,而是

std::_Simple_types<std::_Wrap_alloc<std::_Vec_base_types<int, std::allocator<int> >::_Alloc>::value_type>::value_type &j
Run Code Online (Sandbox Code Playgroud)

这个复杂的定义是什么?它是一样的int&吗?如果没有,那是什么?如果是,为什么它只是推断inti,但不int&j

c++ visual-studio c++11 visual-studio-2013

19
推荐指数
3
解决办法
537
查看次数

复制和交换始终是最佳解决方案吗?

我已经看到了在各个地方推荐的复制和交换习惯用法,作为为赋值运算符实现强异常安全性的推荐/最佳/唯一方法.在我看来,这种方法也有缺点.

考虑以下简化的类似矢量的类,它使用复制和交换:

class IntVec {
  size_t size;
  int* vec;
public:
  IntVec()
    : size(0),
      vec(0)
  {}
  IntVec(IntVec const& other)
    : size(other.size),
      vec(size? new int[size] : 0)
  {
    std::copy(other.vec, other.vec + size, vec);
  }

  void swap(IntVec& other) {
    using std::swap;
    swap(size, other.size);
    swap(vec, other.vec);
  }

  IntVec& operator=(IntVec that) {
    swap(that);
    return *this;
  }

  //~IntVec() and other functions ...
}
Run Code Online (Sandbox Code Playgroud)

通过复制构造函数实现赋值可能是有效的并且可以保证异常安全,但是它也可能导致不必要的分配,甚至可能导致无内存错误.

考虑分配700MB的情况下IntVec,以一个1GB IntVec以<2GB堆限制的机器上.最佳分配将意识到它已经分配了足够的内存,并且只将数据复制到已经分配的缓冲区中.复制和交换实现将导致在释放1GB缓冲区之前分配另一个700MB缓冲区,导致所有3个缓冲区同时尝试在内存中共存,这将不必要地抛出内存不足错误.

这种实现可以解决问题:

IntVec& operator=(IntVec const& that) {
  if(that.size <= size) {
    size = …
Run Code Online (Sandbox Code Playgroud)

c++

18
推荐指数
4
解决办法
1795
查看次数

移动lambda时为什么不调用移动构造函数?

我正在尝试编译以下代码:

#include <utility>

struct C2 {
        C2() = default;
        C2(C2 const&) = delete;
        C2(C2&&) = default;
};

int main() {
        C2 p2;
        ([p2_1{ std::move(p2) }]() {
                auto p2_2 = std::move(p2_1); // <---
        })();
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,这不会编译并给出一个错误,即赋值p2_2为调用已删除的函数,即复制构造函数.请注意,搬迁p2_1很好.为什么这不使用移动构造函数?

c++ lambda move-semantics c++11

18
推荐指数
1
解决办法
846
查看次数