jjzjj

c++ - 转置矩阵的内存黑客破坏堆栈,C++

coder 2024-02-16 原文

我需要用 C++ 实现一个矩阵转置过程。 问题是签名,函数必须这样调用:

transpose(in_mat[0][0], n, m, out_mat[0][0])

其中 n 和 m 是维度。 所有值都是 double 值,包括矩阵和维度。

由于代码是自动生成的,我无法解决这个问题。

我的解决方法是这样的:

void transpose(double& in_mat, const double _n, const double _m, double& out_mat)
{
    int n = _n, m = _m;
    double* in_pointer= &in_mat;
    double* out_pointer= &out_mat;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            *(out_pointer+(j*n+i)) = *(in_pointer+(i*m + j));
        }
    }
}

它工作正常。 我用两个不同宽度和高度的矩阵构建了一个测试用例。一个用随机数填充,另一个用零填充。然后调用转置过程并比较两个矩阵。 功能正确。

但它破坏了堆栈。在 Visual Studio 2015 中运行时出现警告

Run-Time Check Failure #2 - Stack around the variable 'in_mat' was corrupted.

我做错了什么?为什么堆栈损坏? 调用转置后的代码可以正常工作。

编辑:

这是完整的设置:

#include <random>
#include <iostream>

void transpose(double& in_mat, const double _n, const double _m, double& out_mat)
{
    int n = _n, m = _m;
    double* in_pointer = &in_mat;
    double* out_pointer = &out_mat;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            *(out_pointer+(j*n+i)) = *(in_pointer+(i*m + j));
        }
    }
}


int main()
{

    double in_mat[5][4];
    double out_mat[4][5];// assign matrix

    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 5; j++) {
            in_mat[i][j] = std::rand();
            out_mat[j][i] = 0;
        }
    }

    double n = 5;
    double m = 4;

    transpose(in_mat[0][0], n, m, out_mat[0][0]);

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (in_mat[i][j] - out_mat[j][i]>0.0001) {
                std::cout << "code is broken" << std::endl; //never reached
            }
        }
    }
    std::cout << "finished" << std::endl;
}

最佳答案

您的下标(或循环限制)在您初始化矩阵的位置向后。

你有

double in_mat[5][4];
double out_mat[4][5];// assign matrix

for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 5; j++) {
        in_mat[i][j] = std::rand();
        out_mat[j][i] = 0;
    }
}

j==4 你写的超出了 out_mat

关于c++ - 转置矩阵的内存黑客破坏堆栈,C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33846360/

有关c++ - 转置矩阵的内存黑客破坏堆栈,C++的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  4. 旋转矩阵的几何意义 - 2

    点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度;     在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。

  5. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  6. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  7. 键删除后 ruby​​ 哈希内存泄漏 - 2

    你好,我无法成功如何在散列中删除key后释放内存。当我从哈希中删除键时,内存不会释放,也不会在手动调用GC.start后释放。当从Hash中删除键并且这些对象在某处泄漏时,这是预期的行为还是GC不释放内存?如何在Ruby中删除Hash中的键并在内存中取消分配它?例子:irb(main):001:0>`ps-orss=-p#{Process.pid}`.to_i=>4748irb(main):002:0>a={}=>{}irb(main):003:0>1000000.times{|i|a[i]="test#{i}"}=>1000000irb(main):004:0>`ps-orss=-p

  8. ruby-on-rails - OS X Mavericks 破坏了 rbenv? - 2

    最近,我安装了OSXMavericks,它似乎弄乱了我的开发环境。我在运行“railsnewfirst_app”后收到此消息:Youruseraccountisn'tallowedtoinstalltothesystemRubygems.Youcancancelthisinstallationandrun:bundleinstall--pathvendor/bundletoinstallthegemsinto./vendor/bundle/,oryoucanenteryourpasswordandinstallthebundledgemstoRubygemsusingsudo.Pass

  9. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  10. ruby-on-rails - HTTParty 的内存问题和下载大文件 - 2

    这会导致Ruby出现内存问题吗?我知道如果大小超过10KB,Open-URI会写入TempFile。但是HTTParty会在写入TempFile之前尝试将整个PDF保存到内存吗?src=Tempfile.new("file.pdf")src.binmodesrc.writeHTTParty.get("large_file.pdf").parsed_response 最佳答案 您可以使用Net::HTTP。参见thedocumentation(特别是标题为“流媒体响应机构”的部分)。这是文档中的示例:uri=URI('http://e

随机推荐