基本线程导致 malloc():内存损坏:[关闭]

Posted

技术标签:

【中文标题】基本线程导致 malloc():内存损坏:[关闭]【英文标题】:Basic thread leads to a malloc(): memory corruption: [closed] 【发布时间】:2014-08-08 13:06:34 【问题描述】:

我有一个带有简单线程指针的类,我用它在我的构造函数的新线程中启动一个函数。

class Tty 
public:
    Tty();
private:
    void foo();
    std::thread tFoo;
;

using namespace std;

Tty::Tty() 
    tFoo = thread(&Tty::foo, this);


void Tty::foo()  
  cout << "test";

我的主要可以恢复到那个:

int main(int argc, char** argv) 
    Tty* tty = new Tty();
    while (!exitCheck());

但是当我运行这段代码时,我在运行时收到了这个错误:malloc(): memory corruption: 0x000000000133c170。 我做错了什么?

【问题讨论】:

您的示例不需要使用任何指针。另请注意,您可能会使用 using 指令将 std::exit 函数带入全局命名空间(或者它可能已经存在)。 有趣的是,您可以运行此代码。它不适合我。 那我如何在没有指针的情况下保持线程? @LoveMetal,我不确定你所说的“保持”是什么意思。您可以使用构造函数初始化程序列表或非静态数据成员初始化程序对其进行初始化。它由您的对象“保留”,直到它消失(如果 main 只使用常规对象,则它所在的范围结束)。 Look, mom. no pointers。你可能会发现join() 也很有趣。 【参考方案1】:

我更正了您的示例,修复了缺少 thread::join 的问题。如果你不想关心 thread::join - 那么你可以使用detach()。

#include <thread>
#include <iostream>
#include <system_error>

struct Tty


  Tty();
 ~Tty();

private:

 void foo();

 std::thread    _tFoo;
;

Tty::Tty()
  : _tFoo(&Tty::foo, this)



Tty::~Tty()

  _tFoo.join();


void
Tty::foo()

  std::cout << "test" << std::endl;


int
main()

  try
  
    Tty t;
  
  catch (const std::system_error& e)
  
    std::cerr << e.code() << ", " << e.what() << std::endl;
  
  catch (const std::exception& e)
  
    std::cerr << e.what() << std::endl;
  
  catch (...)
  
    std::cerr << "Unknown exception" << std::endl;
  

【讨论】:

为什么在变量名前使用_?那个实现不是保留的吗?而且,如果我不希望线程在初始化时执行,我该怎么办?因为在线程开始之前,我还有许多其他指令要运行。最后一件事,如果我不需要加入,为什么要使用detach() 而不是不使用它? 好的。让我们一步一步来: 1. 为什么要使用前导_?避免函数名和变量之间的冲突。例如。考虑方法 void run() 和变量 bool run。编译器应该如何区分它们? void run() 和 bool _run 很容易解决这个问题。一个好的风格是对静态 _s、常量 _c e.t.c 使用短前缀。 2. 是的,您可以稍后对其进行初始化。像这样: void run() _tFoo = std::thread(&Tty:foo, this); 内联方法有什么问题,特别是如果它们很短?我认为带有前导下划线的 var 名称是不好的风格。 3.你应该明白,基本上线程是一个轻量级的进程。默认情况下,此进程是可连接的,这意味着您可以在线程执行后收集一些执行结果和统计信息。这在加入呼叫后被清除。如果你不需要 - detach() 线程。分离后线程开始执行,不会干扰主线程,所以请确保等待它执行完毕。 @Klaus,只是为了分散您的注意力,看看提升源。你会得到很多关于好与坏的新想法。基本上内联是好的。但在多线程情况下,内联可能指向错误的实例。

以上是关于基本线程导致 malloc():内存损坏:[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

libtorrent-rasterbar 和 QGuiApplication 导致内存损坏

GuardMalloc 导致虚拟内存耗尽

char 指向字符串的指针,然后进入字符串数组。 *** `./a.out' 中的错误:malloc():内存损坏:0x0900c3b0 ***

EasyNVR长期运行播放ws-flv导致线程大量占用且内存增加处理方法

“试图读取或写入受保护的内存。这通常表明其他内存已损坏。”

从不可变对象设置副本是不是可以避免线程损坏? [关闭]