我一直假设std::move()a上会std::shared_ptr窃取指针并将原始指针设置为nullptr-从而不增加引用计数。在我的世界中似乎并非如此。
设置:
MacOS,g ++ -version =>“ Apple LLVM版本10.0.1(clang-1001.0.46.3)”
代码:
#include <cstdio>
#include <memory>
class Thing { public: Thing(int N) : value(N) {} int value; };
void print(const char* name, std::shared_ptr<Thing>& sp)
{ printf("%s: { use_count=%i; }\n", name, (int)sp.use_count()); }
int main(int argc, char** argv) {
std::shared_ptr<Thing> x(new Thing(4711));
print("BEFORE x", x);
std::shared_ptr<Thing> y = std::move(x);
y->value = 4712;
print(" AFTER x", x);
print(" AFTER y", y);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
编译( …
在“sympy”中表达以下内容的最合适方式是什么:
对样本 'x[i]' 的总和,其中 'i' 从具体的 0 到符号的 'N'。'x[i]' 本身应该是象征性的,即总是作为变量出现。
目标是在线性方程组中使用这些表达式。
示例(平凡最小二乘近似):
给定一组样本 (x[i], y[i]),它们应该位于由 'y = m*x + a' 给出的一条线上。即,估计线由“m”和“a”确定。样本和估计线之间的误差可以由下式给出
error(m, a) = sum((m * x[i] + a - y[i])**2, start_i=0, end_i=N)
Run Code Online (Sandbox Code Playgroud)
现在,在导数 'd/dm error(m,a)' 和 'd/da error(m,a)' 中搜索零转换提供了最小距离。我怎样才能找到 sympy 的解决方案?
最近,当使用 '-fsanitize=address' 编译时,我在使用 valgrind 运行应用程序时遇到执行异常,即
“ASan 运行时不会出现在初始库列表中”
我有点不知道 valgrind 实际上做了什么。命令“ldd file.exe”提供
linux-gate.so.1 => (0xb7755000)
libasan.so.3 => /usr/lib/i386-linux-gnu/libasan.so.3 (0xb7199000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6fdf000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb6fd8000)
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb6fcf000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb6fb2000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb6f5c000)
/lib/ld-linux.so.2 (0x80092000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb6f3e000)
Run Code Online (Sandbox Code Playgroud)
任何提示?
我将如何求解包含求和表达式的方程,即类似的东西。
我会考虑使用以下代码片段来求解这个方程:
from sympy import *
i, N, x = symbols("n, N, x")
y = Function("y")
eq = summation(x + y(i), (i, 0, N))
print solve(eq, [x])
Run Code Online (Sandbox Code Playgroud)
然而,虽然这个方程很简单,但solve()并不能产生结果。预期的解决方案是
令 vptr 为指向 vtable 的指针,该 vtable 随其类受虚拟函数约束的对象一起携带。
“vptr”的改变可能不是预期的行为。然而,这种更改不能被检测为非法内存访问,因为指针位于已分配内存的边界内。据我所知,“Efence”和“valgrind/memcheck”不会有帮助。
然而,意外的 vptr 更改可能会导致严重的问题。如果 vptr 被更改为指向任意内存,则删除运算符可能会立即导致分段错误。
是否有任何东西可以在 vtable 或指向 vtable 的指针上设置“守卫”,以便监视任何更改?
Clang++ 似乎并没有完成全部工作。给定
#include <string.h>
#include <stdio.h>
struct X { virtual ~X() {} };
int main(int argc, char** argv)
{
X x;
memset((void*)&x, 0, sizeof(X));
printf("<before exit>\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译并执行...
> clang++ -fsanitize=undefined -fsanitize=vptr tmp.cpp -o test
> ./test
Run Code Online (Sandbox Code Playgroud)
在调用“virtual ~X()”时检测违规行为。
<before exit>
<unknown>: runtime error: member call on address 0xbfe30ab8 which does not point to an object of type 'X' …Run Code Online (Sandbox Code Playgroud) 设置:Python 3.8.2;一些带有重载__contains__()函数的枚举类。
from enum import Enum
class Something(Enum):
A = 1
def __contains__(self, Other):
return Other in self.__class__.__members__.keys()
Run Code Online (Sandbox Code Playgroud)
测试 1:使用枚举本身的值。
print("A:", Something.A in Something)
Run Code Online (Sandbox Code Playgroud)
工作正常(这里结果= A: True)。
测试 2:使用非枚举值。
print("1:", 1 in Something)
Run Code Online (Sandbox Code Playgroud)
失败但有异常,即
TypeError: unsupported operand type(s) for 'in': 'int' and 'EnumMeta'
Run Code Online (Sandbox Code Playgroud)
问题:
如何实现in左操作数可以是任何内容的功能(成员运算符)?也就是说,应该可以写类似的东西
if anything in Something:
...
Run Code Online (Sandbox Code Playgroud)
无需检查 的类型anything。
确定给定矩阵“ M”是否等于同一性的最佳方法是什么?即类似:
if numpy.identity(3) == M:
...
Run Code Online (Sandbox Code Playgroud) 从 CMake 函数内部修改调用者变量的最佳实践是什么?认为
function(MyFunction IN_OUT_NAME)
... what to do here ...
string(APPEND ${IN_OUT_NAME} " and that")
... what to do here ...
endfunction()
Run Code Online (Sandbox Code Playgroud)
需要做什么才能使以下代码片段
set(MY_MESSAGE "this")
MyFunction(MY_MESSAGE)
message(${MY_MESSAGE})
Run Code Online (Sandbox Code Playgroud)
交付
this and that
Run Code Online (Sandbox Code Playgroud)
不重复的评论:
修改函数内的变量是关于 JavaScript 而不是 CMake
JavaScript 是一种按引用传递还是按值传递的语言?是关于 JavaScript 而不是 CMake
鉴于:
Bash 命令行(终端 1):
> mkfifo pipo
> cat pipo
Run Code Online (Sandbox Code Playgroud)
Bash 命令行(终端 2):
> echo -e "Hello World\nHi" > pipo
Run Code Online (Sandbox Code Playgroud)
结果:
(1 号航站楼)中的 bash 打印:
Hello World
Hi
Run Code Online (Sandbox Code Playgroud)
并中止。
问题:
我怎样才能实现它不中止,但允许发送另一个回显pipo?