当我们说一个程序泄漏内存,说新没有删除在C++中,它真的泄漏?我的意思是,当程序结束时,是否仍然将内存分配给某些非运行程序并且无法使用,或者操作系统是否知道每个程序请求的内存,并在程序结束时释放它?如果我多次运行该程序,我会耗尽内存吗?
当使用C++的istream
系列read()
或C 语言从文件(或任何输入流)读取原始数据时fread()
,必须提供缓冲区,以及要读取的数据量.我见过的大多数程序似乎都在512到4096之间任意选择2的幂.
编辑
大多数答案似乎是在编译时无法确定.我很高兴在运行时找到它.
我知道它是一个整数类型,可以在不丢失数据的情况下强制转换为指针,但为什么我要这样做呢?使用整数类型有什么优势void*
可以保存指针和THE_REAL_TYPE*
指针算术?
编辑
标记为"已被询问"的问题没有回答这个问题.问题是如果使用intptr_t
作为一般的替换void*
是一个好主意,那里的答案似乎是"不要使用intptr_t",所以我的问题仍然有效:什么是一个很好的用例intptr_t
?
在我的类中使用的实用程序函数在类中使用private
(可能还有static
)函数是否有任何优势,static
在我的.cpp
实现类的文件中使用全局函数不需要访问实例的数据?
第一个听起来更干净,但第二个真的更有意义,因为这些功能甚至不需要在.h
文件中提及.
说我有这样一个类:
class A {
public:
class B {
// ...
};
static void f();
// ...
};
Run Code Online (Sandbox Code Playgroud)
我可以引用B
as A::B
和f()
as A::f()
,但是我可以导入B
并f()
进入global/current命名空间吗?我试过了
using A::B;
Run Code Online (Sandbox Code Playgroud)
但这给了我一个编译错误.
我需要生成随机数,但是从尽可能宽的范围(至少64位).我不在乎分配是否完美,所以std::rand()
会起作用,但它只返回一个int
.据我所知,c ++ 11具有一些随机数生成功能,可以提供任何大小的数字,但使用起来非常复杂.有人可以发布一个简单的例子,说明如何尽可能简单地使用它以尽可能简单的方式获得所描述的功能(64位或更多随机数)(比如std::rand()
)?
我怎样才能拥有以下命令
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 /
如果我有以下两个循环:
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&
吗?如果没有,那是什么?如果是,为什么它只是推断int
为i
,但不int&
为j
?
我已经看到了在各个地方推荐的复制和交换习惯用法,作为为赋值运算符实现强异常安全性的推荐/最佳/唯一方法.在我看来,这种方法也有缺点.
考虑以下简化的类似矢量的类,它使用复制和交换:
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) 我正在尝试编译以下代码:
#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
很好.为什么这不使用移动构造函数?