小编Zha*_*dze的帖子

广义拷贝构造函数

为什么类shared_ptr在其构造函数中有另一个模板?

例如:

template<class T> class shared_ptr {
public:
  template<class Y>
  explicit shared_ptr(Y * p);
Run Code Online (Sandbox Code Playgroud)

我一直在阅读Scott Meyers的Effective C++,第45项,其中说它背后的想法是通过它们实现多态性; 即,构造shared_ptr<A>shared_ptr<B>如果B从A衍生

但是没有定义像这样的构造函数

explicit shared_ptr(T * p);
Run Code Online (Sandbox Code Playgroud)

足够?我的意思是,这段代码运行得很好:

class C1 {
};

class C2 : public C1 {
};

template<typename T>
class A
{
public:
  A(T &a)
  {
    var1 = a;
  }

  T var1;
};

int main(int argc, char *argv[])
{
  C2 c2;
  A<C1> inst1(c2);
}
Run Code Online (Sandbox Code Playgroud)

那么为什么我们需要另一个构造函数模板呢?

c++ polymorphism inheritance templates

15
推荐指数
1
解决办法
542
查看次数

docker在docker-compose.yml中设置iptables选项

我正在使用docker-compose来管理容器.

当通过docker-compose启动时,如何关闭iptables(为docker设置--iptables = false)?

docker

13
推荐指数
1
解决办法
4877
查看次数

Docker的aufs diff文件夹在大小方面变得越来越大

我对docker的空间使用有问题.我有

在/ var/lib中/泊坞窗/ AUFS /比较/ e20ed0ec78d30267e8cf855c6311b02089b6086ea149c21997a3e6cb9757ecd4的/ tmp /注册表-dev /目录泊坞窗/注册表/ V2 /斑点#杜-SH

4.6G.

我能找到这个文件夹属于哪个容器吗?我有docker注册表运行但在那里我有

/ var/lib/registry/docker/registry/v2/blobs #du -sh

465M.

我怀疑泊坞窗升级(我用的迁移工具https://docs.docker.com/engine/migration/这里)都有可能留下它,或者,我之前建立泊坞窗注册表自己,并移动到预编译注册表左这个.

我可以以某种方式检查它所面对的容器吗?或者,它是否属于任何?

filesystems docker docker-registry

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

使用错误的c_str()时,Valgrind没有显示无效的内存访问

想象一下这样的代码:

string f()
{
  string r = "ab";
  return r;
}

int main() {
    const char *c = f().c_str();
    printf("%s.\n", c);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这段代码可能会崩溃,对吧?因为c指向的字符串被销毁.但是通过Valgrind运行它并没有显示任何无效的内存访问.为什么?我知道Valgrind无法检查堆栈,但"ab"实际上位于堆上,对吧?

c++ string valgrind std

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

Linux内核线程地址空间

我读到Linux内核线程没有自己的地址空间,它们的mm字段设置为NULL。我知道所有内核线程共享地址空间,但是它们仍然有自己的堆栈,对吧?他们需要以某种方式描述那个领域,如果没有mm,他们该如何做到这一点?以及其他列表(例如打开的文件),它们将其保存在哪里?另外,将 active_mm 字段设置为上一个用户任务的 mm 有什么意义?提前致谢。

linux kernel memory-management linux-kernel

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

g++ 4.9.4 缺少 LLONG_MAX?

我试图调试这个简单的大代码:

\n\n
#include "limits.h"\n\nint main()\n{\n  long long a = LLONG_MAX;\n\n  return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我像这样运行它

\n\n
g++ test.cpp\n
Run Code Online (Sandbox Code Playgroud)\n\n

我明白了

\n\n
test.cpp: In function \xe2\x80\x98main\xe2\x80\x99:\ntest.cpp:5:17: error: \xe2\x80\x98LLONG_MAX\xe2\x80\x99 undeclared (first use in this function)\nlong long a = LLONG_MAX;\n
Run Code Online (Sandbox Code Playgroud)\n\n

我检查了这个常量的参考资料,其中写道:

\n\n
\n

LLONG_MINLLONG_MAXULLONG_MAX是为符合 1999 年或更高版本的 C 标准(仅包括 2011 年以来的 C++ 标准:C++11)的库定义的。

\n
\n\n

所以我尝试设置-std=c++11但没有帮助。有什么建议么?

\n\n

PS 相同的代码在其他机器上使用 g++ 5.4.0 可以正常编译

\n\n

更新: LONG_MAX 可见(但 LLONG_MAX 不可见),机器是 debian4

\n

c++ g++ c++11

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

std字符串应该崩溃但不会崩溃

我有一节课:

class A {
  public:
  string B;
};
Run Code Online (Sandbox Code Playgroud)

然后是一个代码:

A a1;
a1.B = "abc";

printf("%p.\n", a1.B.c_str());

A a2(a1);

printf("%p.\n", a2.B.c_str());
Run Code Online (Sandbox Code Playgroud)

两个实例的c_str引用相同的位置(我理解,复制构造函数逐位复制,字符串在内部将数据存储在char*中,并且指针被复制.

但问题是,为什么这段代码不会崩溃?a1和a2是堆栈变量,当解构它们时,字符串B也将被解构,这些字符串的内部字符*(指向相同的内存位置)是否会被删除两次?是不是双重删除,应该导致崩溃?顺便说一下,我禁用了gcc优化,而valgrind也没有显示任何内容.

c++ string memory-leaks memory-management

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

如何在erlang中获取sha256哈希字符串?

我正在尝试通过erlang中的sha256加密字符串,但我无法设法获取字符串.crypto:hash(sha256,somestring)给出了一些二进制文件,我怎么能得到字符串?

erlang cryptography sha256

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

如何从gdb中的指令地址获取源代码行

我试图反汇编地址 A 处的指令,所以我写

(gdb) x/i 0x00007f8aba6ad96c
   0x7f8aba6ad96c <laprintf+167>:   nop
Run Code Online (Sandbox Code Playgroud)

但是如何获取它对应于源代码中的哪一行呢?调试符号可用。

gcc gdb disassembly

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

space作为参数从bash编程

我正在运行来自bash的应用程序,就像这样

./app_name var1 var2 $var3
Run Code Online (Sandbox Code Playgroud)

这里var3--a b, --c d哪里bd不包含空格.

现在我想添加参数--e f,to $var3,但f包含空格.问题是我试图避免这一行的变化.

./app_name var1 var2 $var3
Run Code Online (Sandbox Code Playgroud)

如果我这样离开它,将app_name两部分理解f为两个不同的参数,因此无法解析.

我可以var3以某种方式改变,以便它不会分裂f成两个不同的args吗?我试过把引号放进去,逃避空间,但没有帮助.

linux bash shell whitespace

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

C编译器是否假设添加有符号整数是可交换的?

我正在尝试检查签名添加是否会溢出.一般来说,检查是否

int a + int b
Run Code Online (Sandbox Code Playgroud)

会溢出(a和b都是正面的),我检查是否

if (a > INT_MAX - b)
Run Code Online (Sandbox Code Playgroud)

但现在我想检查一下

int a + int b - int c
Run Code Online (Sandbox Code Playgroud)

会溢出来的.我知道a,b和c是正数,b> = c,所以我做了以下检查:

if (a > INT_MAX - b + c)
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,编译器可以重写

INT_MAX - b + c     to     INT_MAX + c - b   ?
Run Code Online (Sandbox Code Playgroud)

我担心的是,它会首先执行INT_MAX + c,这可能会溢出并导致未定义的行为.

c integer-overflow

0
推荐指数
1
解决办法
98
查看次数