小编Las*_*sie的帖子

重定向中的算术表达式

这两者有什么区别:

cnt=1
head -n $((++cnt)) /etc/passwd >/dev/null
echo $cnt # prints 2
Run Code Online (Sandbox Code Playgroud)

cnt=1
date >$((++cnt)).txt # creates file "2.txt"
echo $cnt # prints 1
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么在第二个示例中打印 1。笔记:

cnt=1
(cnt=5)
echo $cnt # prints 1
Run Code Online (Sandbox Code Playgroud)

我知道为什么这会打印 1。重定向是否也在子 shell 中执行?如果是,在哪里描述的?

linux bash

12
推荐指数
1
解决办法
260
查看次数

为什么GCC集合的数组初始化会首先用零填充整个东西,包括非零元素?

为什么gcc用零而不是仅剩余的96个整数填充整个数组?非零初始值设定项都在数组的开头。

void *sink;
void bar() {
    int a[100]{1,2,3,4};
    sink = a;             // a escapes the function
    asm("":::"memory");   // and compiler memory barrier
    // forces the compiler to materialize a[] in memory instead of optimizing away
}
Run Code Online (Sandbox Code Playgroud)

MinGW8.1和gcc9.2都使asm像这样(Godbolt编译器资源管理器)。

# gcc9.2 -O3 -m32 -mno-sse
bar():
    push    edi                       # save call-preserved EDI which rep stos uses
    xor     eax, eax                  # eax=0
    mov     ecx, 100                  # repeat-count = 100
    sub     esp, 400                  # reserve 400 bytes on the stack
    mov     edi, esp …
Run Code Online (Sandbox Code Playgroud)

c++ x86 assembly gcc compiler-optimization

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

GDB 不起作用:无法插入断点 1。无法访问地址 [...] 处的内存

我正在尝试设置我的 vscode 以使用 WSL 中的 gdb 调试 C++ 程序。但我在 WSL 1 (Ubuntu 22.04 LTS) 上遇到了 gdb 问题。每当我尝试设置断点并运行程序时,都会收到以下错误:

Starting program: /mnt/d/Informatics/vscode/test/a.out
warning: opening /proc/PID/mem file for lwp 7674.7674 failed: No such file or directory (2)
Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0x10e0
Run Code Online (Sandbox Code Playgroud)

程序的内容并不重要,总是会出现错误。代码使用以下行进行编译:

g++ -Wall -pedantic-errors -O2 -std=c++23 -ggdb3 -fdiagnostics-color=always /mnt/d/Informatics/vscode/test/*.cpp
Run Code Online (Sandbox Code Playgroud)

gdb 版本:GNU gdb (Ubuntu 12.0.90-0ubuntu1) 12.0.90
g++ 版本:(12.0.1也尝试过11.2.0- 没有区别)

在使用 MinGW 的 g++ 和 gdb 的 Windows 上,问题不存在,所以这应该意味着我没有使用错误的 gdb 调试器。


编辑:尝试按照评论中的建议从源代码编译 …

c++ gdb g++ visual-studio-code windows-subsystem-for-linux

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

为什么函数参数的析构函数不是在函数末尾调用,而是在函数调用的完整表达式末尾调用?

考虑以下示例:

#include <iostream>

struct A
{
    int n = 0;
    A() { std::cout << "A()" << std::endl; }
    A(const A&) { std::cout << "A(const A&)" << std::endl; }
    ~A() { std::cout << "~A()" << std::endl; }
};

int f(A a) { std::cout << "f()" << std::endl; return 1; }

int main()
{
    A a;
    std::cout << f(a) << " was returned from f(A)" << std::endl;
    std::cout << "leaving main..." << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我期望这个程序的输出是:

A()
A(const A&)
f()
~A()
1 was …
Run Code Online (Sandbox Code Playgroud)

c++

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

调用一个平凡的析构函数有什么影响?

调用一个简单的析构函数会结束一个对象的生命周期吗?我读了这个这个,但没有找到一个好的解释。这些线程声明一个简单的析构函数调用没有效果,并且类似的代码struct A { int x; } a; a.~A(); a.~A();是合法的。但我在标准中发现了这个例子:

struct C { };
void f() {
    C * pc = new C;
    using C2 = C;
    pc->C::~C2(); // OK, destroys *pc
    C().C::~C(); // undefined behavior: temporary of type C destroyed twice
    using T = int;
    0 .T::~T(); // OK, no effect
    0.T::~T(); // error: 0.T is a user-defined-floating-point-literal (5.13.8)
}
Run Code Online (Sandbox Code Playgroud)

这里 C 具有简单的析构函数,但仍然对 C 类型的对象进行双重销毁具有未定义的行为?

c++ destructor lifetime language-lawyer

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

为什么字符串不能在c ++中打印所需的输出?

我正在用c ++编写这段代码.

std::string s;
s[0] = 'a';
std::cout << s;
Run Code Online (Sandbox Code Playgroud)

结果应该是:a

为什么这不打印什么?问题是微不足道的,但任何人都可以用更好的方式解释.

c++

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

复合类型的动态数组

没有类型别名可以做同样的事情吗?

    void f()
    {
        typedef char Str[16];
        int n=256;
        Str** p = new Str*[n];
        delete[] p;
    }
Run Code Online (Sandbox Code Playgroud)

我尝试了以下但没有奏效:

    // char(**p)[16] = new char(*[n])[16]; // error
    // char(**p)[16] = new (char(*[n])[16]); // error
Run Code Online (Sandbox Code Playgroud)

c++ new-operator

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