小编jac*_*row的帖子

当我启动一个新线程时为什么Valgrind会出现段错误

我正在用C++编写一个程序,我注意到一些非常奇怪的东西.

当我在Xcode下运行程序时,一切正常,但是当我在Valgrind下执行时,它会segmentation fault在几秒钟后给我一个.

我设法提取了一个非常简单的代码,它给了我这个错误:

#include <thread>

void exec_1() {}

int main(int argc, const char * argv[]) {

    std::thread simulator_thread;
    simulator_thread = std::thread(exec_1);
    simulator_thread.join();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在做的只是使用这些标志在Xcode下构建我的可执行文件:

CFLAGS:

-I/usr/local/lib/python3.6/site-packages/numpy/core/include
-I/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/include/python3.6m 
-Wno-unused-result -Wsign-compare -Wunreachable-code
-fno-common -dynamic -DNDEBUG -g -fwrapv -Wall -Wstrict-prototypes
Run Code Online (Sandbox Code Playgroud)

LDFLAGS:

-L/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/config-3.6m-darwin
-lpython3.6m -ldl -framework CoreFoundation
Run Code Online (Sandbox Code Playgroud)

然后在Valgrind下运行可执行文件以查找内存泄漏.你会看到我正在调用它,Python C API因为我在我的main代码中使用它但是这段代码却抛弃了我segfault而不使用它们.

无论如何Valgrind,以及其他一些东西,给我以下输出:

Thread 2:
==41660== Invalid read of size 4
==41660==    at 0x1016FA899: _pthread_body (in /usr/lib/system/libsystem_pthread.dylib)
==41660==    by 0x1016FA886: _pthread_start (in /usr/lib/system/libsystem_pthread.dylib)
==41660==    by …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading valgrind segmentation-fault

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

从终端打印目录中的文件列表到文本文件(但不是文本文件本身)

我想将目录中每个文件的所有文件名打印到.txt文件中.

我们假设我有一个包含3个文件的目录:

file1.txt
file2.txt
file3.txt
Run Code Online (Sandbox Code Playgroud)

我尝试过使用ls > output.txt.

问题是,当我打开时,output.txt我找到这个列表:

file1.txt
file2.txt
file3.txt
output.txt
Run Code Online (Sandbox Code Playgroud)

有没有办法避免打印我重定向输出的文件的名称?或者更好的是有一个命令能够打印除一个目录之外的目录中的文件的所有文件名吗?

bash ls

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

thread_local变量初始化

我知道这是一个非常基本的问题,但我找不到简单的答案。

我正在编写一个程序,其中需要一些变量thread_local。根据我的理解,这意味着这些变量“像全局变量”,但每个线程都有自己的副本。

我将这些变量放在一个专用的命名空间中,utils在头文件中调用Utilities.hpp,以这种方式调用:

// Utilities.hpp
namespace utils {
    extern thread_local int var1;
    extern thread_local int var2;
    extern thread_local std::vector<double> vect1;
}
Run Code Online (Sandbox Code Playgroud)

我使用extern关键字是为了避免多重声明。无论如何,当我尝试像这样初始化.cpp文件中的这些变量时namespace

// Utilities.cpp
namespace utils {
    int var1;
    int var2;
    std::vector<double> vect1;
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Non-thread-local declaration of 'var1' follows thread-local declaration
Run Code Online (Sandbox Code Playgroud)

var2对于其他所有变量也是如此vect1

我尝试在文件中的程序开头将它们初始化为类的普通静态变量,main.cpp如下所示:

int utils::var1;
int utils::var2;
std::vector<double> utils::vect1;

int main(int argc, const char * argv[]) {

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但我得到的错误总是相同的。

我不明白如何初始化这种变量,我做错了什么?

c++ initialization thread-local c++11

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

具有可变类型容器的类模板

我想知道是否可以创建一个类模板,其中的对象必须是容器,但属于用户指定的类型。

例如,现在我有一个这样的课程:

template<class T>
class Myclass {
    std::queue<T> queue;

    // SOME OTHER MEMBERS
}
Run Code Online (Sandbox Code Playgroud)

但我希望能够std::queue在需要时将该对象设为其他类型的容器,例如std:stack,以便能够处理具有除 FIFO 之外的其他类型策略的容器。

是否可以?或者是否有任何其他解决方案不涉及我创建另一个与此完全相同的类,但使用 astack而不是 a queue

c++ containers templates

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

"stringstream"是否复制构造它的字符串?

在像这样的一段代码中

std::string s("random;string;");
std::stringstream s_stream(s);
Run Code Online (Sandbox Code Playgroud)

确实s_stream复制了s

我的意思是,如果在创建s_stream之后我修改了会发生什么s

c++ string stringstream

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