这两者有什么区别:
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 中执行?如果是,在哪里描述的?
为什么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) 我正在尝试设置我的 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 调试器。
编辑:尝试按照评论中的建议从源代码编译 …
考虑以下示例:
#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) 调用一个简单的析构函数会结束一个对象的生命周期吗?我读了这个和这个,但没有找到一个好的解释。这些线程声明一个简单的析构函数调用没有效果,并且类似的代码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 ++编写这段代码.
std::string s;
s[0] = 'a';
std::cout << s;
Run Code Online (Sandbox Code Playgroud)
结果应该是:a
为什么这不打印什么?问题是微不足道的,但任何人都可以用更好的方式解释.
没有类型别名可以做同样的事情吗?
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++ ×6
assembly ×1
bash ×1
destructor ×1
g++ ×1
gcc ×1
gdb ×1
lifetime ×1
linux ×1
new-operator ×1
windows-subsystem-for-linux ×1
x86 ×1