小编bar*_*gol的帖子

X请求失败的错误:BadAlloc(操作资源不足)

我注意到这个问题在过去已被多次询问并在网上浏览我发现了许多关于它的页面.但是,似乎提议的解决方案很少有效,在我的情况下,问题并不是指我编写的程序.所以我会在这里再试一次.

我最近在笔记本电脑上安装了Linux Mint 14.在操作系统出现问题之后,我开始安装我需要的软件,以及这些netgen(Mesh Generator软件).我试过两种方法:下载+解压缩+编译+安装和synaptic.无论哪种方式,这是我尝试执行程序时得到的输出

X请求失败的错误:BadAlloc(操作资源不足)

失败请求的主要操作码:154(GLX)

失败请求的次要操作码:3(X_GLXCreateContext)

失败请求的序列号:490

输出流中的当前序列号:491

正如我所说,我浏览网页,显然,这被认为与X服务器配置中的某些问题有关.在这里开始一团糟.有人说我应该修改/etc/X11/Xorg.conf,添加线条

选项"Videoram""65536"

选项"Cachelines""1980"

在"设备"部分下.不幸的是,我没有这样的文件,显然在最近的发行版中,X配置文件已被移动到/usr/share/X11/xorg.conf.d/*现在它被拆分成不同的文件.关于显示器和图形的那个应该被称为10-monitor.conf ...我没有.我尝试按照链接的说明创建一个,然后添加这些行,但没有任何反应.公平地说,我不是100%确定我正确生成了文件,因为我不确定如何检测我的显卡的驱动程序.

我不知道人们需要了解多少和哪些信息才能知道如何解决这个问题.这是我看到的可能有用的东西.

'lspci |的输出 grep VGA'是

01:05.0 VGA兼容控制器:Advanced Micro Devices [AMD] nee ATI RS880M [Mobility Radeon HD 4200系列]

我目前/usr/share/X11/xorg.conf.d/10-monitor.conf的情况如下

Section "Monitor"
  Identifier "Monitor0"
  Modeline "1920x1080_60.00"  172.80  1920 2040 2248 2576  1080 1081 1084 1118  -HSync +Vsync
EndSection

Section "Device"
    Identifier    "LVSD"
    Driver        "fglrx" #Choose the driver used for this monitor
EndSection

Section "Screen"
  Identifier "Screen0"
  Device "LVDS"
  Monitor …
Run Code Online (Sandbox Code Playgroud)

xorg linux-mint

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

MPI内存泄漏

我正在编写一些使用MPI的代码,我在使用valgrind运行时会注意到一些内存泄漏.在尝试确定问题所在的时候,我最终得到了这个简单(并且完全没用)的主要内容:

#include "/usr/include/mpi/mpi.h"

int main(int argc,char** argv)
{
MPI_Init(&argc, &argv);
MPI_Finalize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,此代码不执行任何操作,不应创建任何问题.但是,当我使用valgrind运行代码时(包括串行和并行情况),我得到以下摘要:

== 28271 ==堆概要:

== 28271 ==在退出时使用:2,745块中的190,826字节

== 28271 ==总堆使用量:11,214个allocs,8,469个frees,分配16,487,977个字节

== == 28271

== 28271 ==泄漏摘要:

== 28271 ==绝对丢失:55块中的5,950字节

== 28271 ==间接丢失:32个块中的3,562个字节

== 28271 ==可能丢失:0个块中的0个字节

== 28271 ==仍然可以访问:在2,658个块中有181,314个字节

== 28271 ==抑制:0个块中的0个字节

我不明白为什么会有这些泄漏.也许只是我无法读取valgrind输出或正确使用MPI初始化/完成...

我在64位架构上使用ubuntu下的OMPI 1.4.1-3,如果这有帮助的话.

非常感谢你的时间!

valgrind memory-leaks mpi

9
推荐指数
2
解决办法
3954
查看次数

析构函数结束时的分段错误

我不知道这个问题是否会明确,因为我不能提供太多细节(我正在使用TPL并且自己写了大量的行).但我会试一试.

我遇到了一个我无法理解的分段错误.有一个结构(我没有设计但应该经过充分测试),其析构函数看起来像这样

Data::~Data()
{
  if(A_ != 0) {
    delete A_;
    A_ = 0;
  }

  if(B_ != 0) {
    delete B_;
    B_ = 0;
  }

  if(C_ != 0) {
    delete C_;
    C_ = 0;
  }
} // HERE
Run Code Online (Sandbox Code Playgroud)

令我困扰的是,在调试时,我得到了段错误发生在标有"HERE"的行.类Data只有A_,B_和C_作为动态分配的属性.我还尝试在其他非动态复合属性上显式调用析构函数,以查看在销毁过程中是否出现错误,但是在析构函数结束时又发生了段错误.什么样的错误可以在这一点上产生段错误?

我希望这个问题很清楚,如果需要我会添加细节.

编辑:谢谢你的回复.我知道这是一段稀疏的代码,但整个库当然太大了(顺便说一下,它来自Trilinos,但我认为错误不是他们的错,在处理他们的结构时一定是我的错误.我使用过短名称,以保持问题更紧凑).有人在评论中回答说:

  • 关于删除之前的检查和原始指针:正如我所说,这不是我的选择.我猜这是一个双重保护,以防出现问题,A_,B_或C_已经被数据结构的其他所有者删除了.选择原始指针vs shared_ptr或其他安全/智能指针可能是因为这个类几乎从不直接使用,而只是由具有指向Data的指针的Map类的对象.这个类Map在同一个库中实现,因此他们可能选择了原始指针,因为他们知道他们正在处理什么以及如何处理.
  • 是的,数据结构由同一对象的所有副本共享.特别是,有一个Map类,它包含一个指向Data对象的指针.所有Map都是彼此的副本,共享相同的数据.引用计数器跟踪有多少Map持有指向数据的指针.要销毁的最后一个Map删除数据.
  • 数据结构的引用计数器正常工作,我检查了它.
  • 我不是在叫这个类的析构函数.它由类Map的对象的析构函数自动调用,该对象具有指向Data作为属性的指针.
  • 数据继承自BaseData,其(虚拟)析构函数不执行任何操作,因为它只是一个定义类的接口.
  • 发布重现问题的代码很难.因为许多的原因.该错误仅出现在2个以上的进程(这是一个mpi程序),我猜它是一个进程有一些空的列表并尝试访问某个元素.
  • 关于错误细节.我可以在这里给你在调试过程中错误的回溯中的最后一项(我为糟糕的格式道歉,但我不知道如何把它很好地说):

    1. 加密中的0x00007ffff432fba5(sig =)at ../nptl/sysdeps/unix/sysv/linux/raise.c:64

    2. 在abort.c:92中的abort()中的0x00007ffff43336b0

    3. 0x00007ffff436965b在__libc_message(do_abort =,FMT =)在../sysdeps/unix/sysv/linux/libc_fatal.c:189

    4. 0x00007ffff43736d6在malloc_printerr:在malloc.c(动作= 3,STR = 0x7ffff4447780 "免费()损坏未分选的块",PTR =):6283

    5. 位于malloc.c的__libc_free(mem =)中的0x00007ffff4379ea3:3738

    6. 0x0000000000c21f71在Epetra_BlockMapData ::〜Epetra_BlockMapData(这= 0x1461690,__in_chrg =)在/home/bartgol/LifeV/trilinos/trilinos-10.6.4-src/packages/epetra/src/Epetra_BlockMapData.cpp:110

最后,让我重申一下我的疑问:即使所有属性都已被删除,析构函数的结尾会出现什么样的错误?再次感谢!

c++ destructor segmentation-fault

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

Git 状态与不同远程的比较

这里已经提出了类似的问题,但我认为它被误解了(或者也许我误解了这个问题)。那我就在这里问清楚吧。当我这样做时git status,我会得到一条线(除其他外),告诉我我是否落后于我正在跟踪的远程分支(或从其分叉)。这很棒。然而,我有不止一个遥控器。我有一个“官方”遥控器(来源),它是共享的(只有当东西“准备好”时我才推送到那里),还有一个“个人”遥控器(工作),我用它从家庭/工作中推送东西,所以当我切换电脑时我可以继续工作。现在,当我这样做时git status,会将本地分支与origin/branch_name(或我正在跟踪的任何远程分支)进行比较。然而,我也想将它与其他遥控器/分支进行比较,但不拉动,只是比较。理想情况下,我想做这样的事情:

git fetch work
git status work/branch_name
Run Code Online (Sandbox Code Playgroud)

并获取我的本地分支与 work/branch_name 的状态比较。

请注意,我不想进行比较,也就是说,我对哪些文件/路径不同不感兴趣。我只是想看看两个分支是否/何时分叉,或者一个分支是否领先于另一个分支。

另请注意,我可以使用图形方式获取此信息gitk --all,查看两个分支在树中的位置,但我想从命令行执行此操作。另外,如果有多个分支,显示的树gitk --all可能会很混乱。

谢谢

git git-status

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

gdb:查看未使用的 struct typedef

我无法查看我定义的结构的所有 typedef。特别是,如果未使用 typedef,则 gdb 在打印类型时不会显示它。这是一个例子:

struct D
{
  typedef double dtype;
  typedef int itype;
};

int main(int /*argc*/, char** /*argv*/)
{
  D::dtype t;

  t = 2;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我运行 gdb 时,我输入ptype D,但我只得到以下内容

(gdb) ptype D
type = struct D {
    typedef double dtype;
}
(gdb) 
Run Code Online (Sandbox Code Playgroud)

有没有办法打印所有类型定义,即使它们没有被使用?杂项信息:

  1. 我有set print type typedefs on
  2. 我用调试符号编译:g++ -g -o test main.cpp
  3. gdb版本是7.10
  4. 海湾合作委员会版本是5.3

c++ gdb

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

std :: cout声明如何工作?

std::cout对象在iostream头文件中声明为

namespace std _GLIBCXX_VISIBILITY(default)
{
...
extern ostream cout;
...
}
Run Code Online (Sandbox Code Playgroud)

从现在开始,我正在删除std::前缀.

所以,据我所知,cout"只是"类型的对象ostream.我开始想知道为什么东西打印到屏幕cout而不是其他ostream对象,所以我试图创建一个类型的对象ostream,但编译器不会让我.事实上,ostream它只是一个别名basic_ostream<char>,并且该类型的默认构造函数受到保护.很好,我想.但后来我想知道:为什么cout合法的宣言开始?为什么不发出编译器错误?

我再次尝试ostream用关键字声明一个extern,例如

extern ostream os;
os << "Will you compile?\n";
Run Code Online (Sandbox Code Playgroud)

这次我得到了os的未定义引用错误.然后问题就转移到以下问题:是否存在cout其他地方的"定义" ?如果是的话,在哪里?

我无法理解这一点.我知道,出于性能和安全的原因,标准标题是以一种"神秘"的方式编写的,除非你完全掌握语言(我仍然不太可能),否则并不总是易于阅读,但我我想了解这一点.

谢谢.

c++ cout

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

默认参数的默认构造

前提:我很懒.而且我不喜欢排长队.

假设您有一个带有一个参数的函数,并且您想为该参数指定一个默认值.假设参数是a std::map,默认只是一个空映射.这样做的方法是

void foo (std::map<Key,Value> the_map = std::map<Key,Value>());
Run Code Online (Sandbox Code Playgroud)

现在,如果Key和/或名称Value很长(可能是模板化的),则函数声明变长.有办法写一些类似的东西会很好

void foo (std::map<Key,Value> the_map = auto);
Run Code Online (Sandbox Code Playgroud)

现在,我知道这不是关键字的使用auto,但它只是解释了这个概念:我不想仅仅因为必须写下一个简单的默认构造的默认元素而将已经很长的函数声明的长度加倍.我只是想告诉编译器"看看,在那里构建一个默认的".有没有办法做到这一点?此外,有人也觉得这个需要吗?

注意:是的,我可以输入定义地图类型并使用短名称.但我想采用不同的方式.注2:是的,我也可以重载该函数,因此它的一个版本不带参数而另一个版本不带参数.但我想采用不同的方式.

我想我正在寻找的是"默认默认参数"......

c++ function default-value

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