小编Fan*_*Fox的帖子

具有相同编译器的相同程序代码导致不同的二进制文件

我的代码有一个问题,有一些非常奇怪的症状.

  1. 代码在我的计算机上编译,具有以下版本:

    一个.GCC版本:4.4.2

    湾 CMAKE verson:2.8.7

    C.QNX(操作系统)版本:6.5.0

并且代码有一个段错误,同时释放一些内存并从函数中退出(不会死于任何代码,只是在函数退出时).

关于这个的奇怪之处是:

  1. 代码在发布模式下执行但不在调试模式下执行:

    一个.代码是线程化的,因此这表示竞争条件.

    湾 我无法通过将其置于调试模式进行调试.

  2. 在具有相同版本的所有东西的同事机器上编译时的代码没有这个问题.

    一个.关于这一点的奇怪之处在于,工作人员代码可以工作,而且在他的机器上编译时创建的二进制文件(大约相同)大约增加了6mB.

现在烦人的是我无法发布代码,因为它太大而且也适合工作.但是,任何人都可以指出我解决这个问题的方法.

由于我使用QNX,我的调试工具受限,我无法使用Valgrind,因为QNX不支持,GDB并没有真正帮助.

我正在寻找有类似/相同问题的人,原因是什么,以及他们如何修复它.

编辑:

Sooo ......我发现它是什么,但我仍然对它是如何发生有点困惑.

罪魁祸首是这个:

Eigen::VectorXd msBb = data.modelSearcher->getMinimumBoundingBox();
Run Code Online (Sandbox Code Playgroud)

其定义getMinimumBoundingBox是这样的:

Eigen::VectorXd ModelSearcher::getMinimumBoundingBox();
Run Code Online (Sandbox Code Playgroud)

它返回一个始终初始化为的VectorXd VectorXd output(6, 1).所以我立即想到了,这一定是因为VectorXd没有被初始化,而是将其更改为:

Eigen::VectorXd msBb(6, 1); msBb = data.modelSearcher->getMinimumBoundingBox();
Run Code Online (Sandbox Code Playgroud)

但这没效果.事实上,我必须通过将函数的定义更改为此来修复它:

void ModelSearcher::getMinimumBoundingBox(Eigen::MatrixXd& input);
Run Code Online (Sandbox Code Playgroud)

并呼吁这一点

Eigen::VectorXd msBb(6, 1); data.modelSearcher->getMinimumBoundingBox(msBb);
Run Code Online (Sandbox Code Playgroud)

所以现在新问题:

我勒个去?为什么没有第一次改变工作,但第二次做了,为什么我必须通过引用?哦,还有一个大问题,当我的同事编辑它并运行它时,怎么没有这个突破呢?它是一个直接的内存错误,当然它不应该依赖于哪台计算机编译它,特别是因为编译器和所有其他重要的东西都是一样的!!

谢谢你的帮助.

c++ multithreading qnx segmentation-fault

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

突出显示matlab图的部分内容

我有一个matlab图,看起来像这样:

在此输入图像描述

其中每个子图的Y值存储在单维数组中.我想要做的是找到一个顶部图形高于某个高度的区域,如0.5.我还想在其他图表中突出显示相同的区域.

这是我所说的一个例子:

在此输入图像描述

到目前为止我能找到的最好的功能area是填充matlab网格上的一个区域.但是,如果有人可以告诉我如何使其透明,以及如何填充多个区域而无需执行大量区域命令.

否则,我可以在结构中识别一组区域并使用for循环来绘制它们.这是我将要做的方式的一些伪代码:

countstruct = 1;
for i = 1:length(yValue)
    if (yValue(i) > 1)
        outside = [outside, i]
    else
         areas(countstruct).outside = outside;
         countstruct = countstruct + 1;
         clear outside;

     end
 end
Run Code Online (Sandbox Code Playgroud)

然后绘制我会这样做的区域:

for i = 1:length(areas)
    area(areas(i).outside, ones(length(area), 1)*14, "SomeThingToMakeItTransperant')
end
Run Code Online (Sandbox Code Playgroud)

我会为每个子图做到这一点.显然这很复杂,所以最好有一个班轮.谁能想到一个?

matlab plot area fill

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

std :: shared_ptr如何删除带有受保护的析构函数的多态类型?

在以下示例中:

class Base {
    protected:
    ~Base() {
        cout << "B\n";
    }
};

class Derived : public Base {
    public:
    virtual ~Derived(){
        cout << "D\n";
    }
};


int main() {
    Base *myBase_raw = new Derived();
    delete myBase_raw;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

你期望得到:

错误:'virtual Base :: ~Base()'在此上下文中受到保护delete myBase_raw;

这很好,是阻止人们删除对象的有用工具.这也是如此std::unique_ptr.但是当你将原始指针交换为a时std::shared_ptr,它会正确编译:

int main() {
    std::shared_ptr<Base> myBaseS(new Derived());
}
Run Code Online (Sandbox Code Playgroud)

似乎运行删除对象并调用BaseDerived析构函数(实例).根据cppreference:

使用delete-expression或在构造期间提供给shared_ptr的自定义删除器来销毁对象.

由于我没有提供自定义删除器,因此应该调用delete.以上怎么可能?

c++ pointers c++11

8
推荐指数
0
解决办法
148
查看次数

如何检测一个类是否有成员变量?

问题

我想检测一个类是否有成员变量,如果有的话就失败静态断言.就像是:

struct b {
    int a;
}
static_assert(!has_member_variables<b>, "Class should not contain members"). // Error.

struct c {
    virtual void a() {}
    void other() {}
}
static_assert(!has_member_variables<c>, "Class should not contain members"). // Fine.

struct d : c {
}
static_assert(!has_member_variables<d>, "Class should not contain members"). // Fine.

struct e : b {
}
static_assert(!has_member_variables<e>, "Class should not contain members"). // Error.

struct f : c {
    char z;
}
static_assert(!has_member_variables<f>, "Class should not contain members"). // Error.
Run Code Online (Sandbox Code Playgroud)

有没有办法通过SFINAE模板实现这一目标?这个类可能具有继承或甚至具有虚函数的多继承(尽管基类中没有成员). …

c++ templates sfinae

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

int{10} 和 10 之间有什么区别?

作为标题,我有两个表达:

int&& a = const_cast<int&&>(int{10});
int&& a = const_cast<int&&>(10);
Run Code Online (Sandbox Code Playgroud)

第一次编译通过,但第二次没有。为什么会这样?

在我看来,这是因为 10 是一个文字,而 int{10} 是一个未命名的变量。是吗?

c++ c++11

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

plot3基于值的线条颜色

我有一组包含3d笛卡尔点(x,y,z)和时间戳的数据.

我想将此数据绘制为3d空间中的连接线,线条颜色根据时间戳值而变化.

实际上我想在彩条中显示时差.

有谁知道这样做的方法?

matlab plot colors

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

在MATLAB中正确使用clearvars

该功能clearvars具有此处提供的说明.

所以说我有一组变量,

 a, b, c, d
Run Code Online (Sandbox Code Playgroud)

我想清除这些变量,除了d我应该能够这样做:

clearvars * -except d
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

 clearvars * -except d
                |
Error: Unexpected MATLAB expression.
Run Code Online (Sandbox Code Playgroud)

这是什么原因?

matlab clear

7
推荐指数
2
解决办法
6288
查看次数

线程安全单个变量

我理解线程安全的概念.我正在寻求在尝试保护单个变量时简化线程安全性的建议.

说我有一个变量:

double aPass;
Run Code Online (Sandbox Code Playgroud)

我想保护这个变量,所以我创建了一个互斥锁:

pthread_mutex_t aPass_lock;
Run Code Online (Sandbox Code Playgroud)

现在有两种很好的方法可以让我想到这样做,但它们都有令人讨厌的缺点.第一个是创建一个线程安全类来保存变量:

class aPass {
    public:
        aPass() {
            pthread_mutex_init(&aPass_lock, NULL);
            aPass_ = 0;
        }

        void get(double & setMe) {
            pthread_mutex_lock(aPass_lock);
            setMe = aPass_
            pthread_mutex_unlock(aPass_lock);
        }

        void set(const double setThis) {
            pthread_mutex_lock(aPass_lock);
            aPass_ = setThis;
            pthread_mutex_unlock(aPass_lock);
        }
    private:
        double aPass_;
        pthread_mutex_t aPass_lock;
};
Run Code Online (Sandbox Code Playgroud)

现在,这将保持aPass完全安全,没有任何错误,永远不会碰它,是的!然而,看看所有混乱,并想象访问它时的混乱.毛.

另一种方法是让它们都可访问,并确保在使用aPass之前锁定互斥锁.

pthread_mutex_lock(aPass_lock);
   do something with aPass
pthread_mutex_unlock(aPass_lock);
Run Code Online (Sandbox Code Playgroud)

但是,如果有一个新人参与该项目,如果你忘记一次锁定该怎么办呢.我不喜欢调试线程问题他们很难.

是否有一个很好的方法(使用pthreads,因为我必须使用QNX,它几乎没有提升支持)要锁定单个变量而不需要大类,那么只需创建一个互斥锁就可以更安全吗?

c++ multithreading thread-safety

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

在matlab中更改图形视图

有没有办法使用surf()样式数据格式来创建热图?

我有一堆形式的分散数据z=f(x,y)(所以我曾经TriScatteredInterp使它工作meshgrid),我想z用热图可视化.surf已经做了类似于我想要的事情,除了你必须手动旋转图形以使视图自上而下看XY平面.

基本上,我想要类似的东西: 热图

但冲浪默认情况下会给你这个: 在此输入图像描述

matlab matlab-figure

7
推荐指数
3
解决办法
2627
查看次数

Visual Studio远程编译和运行

我试图弄清楚是否可以将Visual Studio 2012用作完整的Linux开发套件.我知道这不是常规问题,而是和我一起工作.到目前为止,我能够使用Visual Studio作为文本编辑器在我的计算机上运行的Linux虚拟机内编辑.

我这样做的方法是设置一个永久的ssh门户,在我的窗口中充当硬盘驱动器.我使用名为WebDrive的程序完成了这项工作:

在此输入图像描述

这很酷,这意味着我有能力从Visual Studio完全查看我的Linux c ++项目.这提供了我喜欢的关于visual studio的所有酷c ++编辑内容.

那么从哪里来?

基本上我现在拥有的是一个重要的美化文本编辑器.

我想做的是让整个'shabam'工作.

我希望能够在服务器地址远程编译和运行visual studio中的代码.可能吗?代码是用cmake和g ++编译器构建的吗?

c++ ide visual-studio-2012

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