写了一个bug----使用已经被删除的内存(代码片段)

菜菜 菜菜     2022-11-21     541

关键词:

#include <iostream>
#include <stdio.h>
#include <memory.h>

using namespace std;
const int NN = 5;
class Piece

    private:
        int r;
        int c;
        int** p;
    public:
        Piece()
                : r(0), c(0)
        
            p = nullptr;
        
        Piece(int r, int c, int (*pp)[NN])
        
            this->r = r;
            this->c = c;
            this->p = new int*[r];

            for(int i = 0; i < r; i++)
            
                this->p[i] = new int[c];
                memcpy(this->p[i], pp[i], c * sizeof(int));
            
        
        ~Piece()
        
            cout<<"delete"<<endl;
            for(int i = 0; i < r; i++)
                delete[] p[i];
            delete this->p;
        
        int getR()
        
            return this->r;
        
        int getC()
        
            return this->c;
        
        int ** getP()
        
            return this->p;
        

;

int N;
int r, c;
int m[10][10];
Piece piece[NN];
int pi = 0;
void dump()

    for(int i = 0; i < pi; i++)
    
        for(int j = 0; j < piece[i].getR(); j++)
        
            for(int k = 0; k < piece[i].getC(); k++)
            
                cout << piece[i].getP()[j][k];
            
            cout << endl;
        
        cout << endl;
    

int main()

    freopen("d://1.text", "r", stdin);
    while (cin >> N && N)
    
        memset(m, 0, sizeof(m));
        memset(piece, 0, sizeof(piece));
        int p[NN][NN];
        pi = 0;
        for(int i = 1; i <= N; i++)
        
            scanf("%d %d", &r, &c);
            for(int j = 0; j < r; j++)
                for(int k = 0; k < c; k++)
                
                    char t;
                    cin >> t;
                    if(t == 0)
                        p[j][k] = 0;
                    else
                        p[j][k] = i;
                
            Piece pp(r, c, p);
            piece[pi++] = pp;
            cout<<"for end"<<endl;
        
    
    //dump();
    return 0;

输出

for end  //循环结束输出
delete   //删除pp对象
main end //main函数结束

//下面是5个delete 和 const int NN=5对应

delete 
delete
delete
delete
delete

//所以, delete 0 永远都是安全的

//注意前面有个  

memset(piece, 0, sizeof(piece));

 

使用jni遇到的诡异内存bug

jni返回到java层的字符串有时正确,有时错误。错误的字符串可能是任何一串字符,看起来很奇怪。通过加日志,得知生成的jstring已经不正确了,所以怀疑生成jstring用的char*有问题,可能被释放了。分析代码,里边用的char*是从st... 查看详情

同事写了一个责任链模式,bug无数!(代码片段)

...责任链工厂改造聊聊其他最近,我让团队内一位成员写了一个导入功能。他使用了责任链模式,代码堆的非常多,bug也多,没 查看详情

git删除分支的方式

...ature,bug,development等类型的分支。使用git的时候,尽量将每一个特性或者bug单独创建分支开发,这样方便提交pullrequest,方便代码审核,方便版本回滚。当我们在github,gitlab上图形化删除分支的时候,其实只是删除了git仓库中的分支... 查看详情

同事写了一个责任链模式,bug无数...

...责任链使用场景结语背景最近,我让团队内一位成员写了一个导入功能。他使用了责任链模式,代码堆的非常多,bug也多,没有达到我预期的效果。实际上,针对导入功能,我认为模版方法更合适!为... 查看详情

细说智能指针

...下,使用指针却忘记释放带来的危害。首先,我们要定义一个类。这次,还是定义女朋友类吧(之 查看详情

system32目录下.dll文件无法删除,文件正在被另一个人或程...怎么删除

SYSTEM32目录下.dll文件无法删除,文件正在被另一个人或程...,好像是病毒,.请问怎么删除啊●如果可执行文件的映像或程序所调用的DLL动态链接库文件还在内存中未释放,删除时就会提示文件正在使用,解决方法是删除系统的页面... 查看详情

foreach……in(代码片段)

使用一个变量迭代一个对象的所有属性值,对于每一个属性值,有一个指定的语句块被执行.作为ECMA-357(E4X)标准的一部分,foreach...in语句已被废弃,E4X中的大部分特性已被删除,但考虑到向后兼容,foreach...in只会被禁用而不会被删除,可以... 查看详情

[svc]共享内存(代码片段)

...列出共享内存,-s列出共享信号量,-q列出共享队列。ipcrm使用方法通过指定ID删除删除IPC资源,同时将与IPC对象关联的数据一并删除,只有超级用户或IPC资源创建者能够删除ipcrm-Mshmkey#移除用shmkey创建的共享内存段ipcrm-mshmid#移除... 查看详情

同事写了一个责任链模式,bug无数...(代码片段)

背景最近,我让团队内一位成员写了一个导入功能。他使用了责任链模式,代码堆的非常多,bug也多,没有达到我预期的效果。实际上,针对导入功能,我认为模版方法更合适!为此,隔壁团队也... 查看详情

free(代码片段)

...输出才能帮助我们了解系统的内存状况。buff/cache先来提一个问题:buffer和cache应该是两种类型的内存,但是free命令为什么会把它们放在一起呢?要回答这个问题需要我们做些准备工作。让我们先来搞清楚buffer与cache的含义。buffer... 查看详情

第五十六课树中结点的删除操作(代码片段)

  返回的指针谁来负责释放呢?我们采取的措施是使用智能指针来管理这棵树的生命周期。 返回一棵子树的好处是在某些场合,我们能够将H、I、J、M重组,并将它们重新的加回原来的树中。示例:main函数使用了p指针... 查看详情

如何释放python占用的内存

...减少。例如foo(x)运行结束,x被销毁;当变量被赋值给另一个对象时,原对象的引用计数也会减少。例如x=4,这时候3这个对象的引用计数就减1了;使用del删除一个变量也会导致对象引用减少。例如delx;对象从集合对象中移除。... 查看详情

一个逗号表达式导致的bug

前两天一个同事写了一个需求提测,测试的时候发现了一个BUG,然后他改完后我没太看懂就咨询了下是什么情况。 需求背景:电脑内存小于某个条件了就做一个事情。 示例代码:MEMORYSTATUSEXstatus;GlobalMemoryStatusEx(&status)... 查看详情

译ringbahn的两个内存bug(代码片段)

...导致段错误,分配器中止以及匪夷所思的未定义行为。我已经修复了我所能找到的bugs 查看详情

c++内存重叠(代码片段)

...我们使用指针访问内存时,如果指针指向的内存区域与另一个区域有交叉部分,就会产生内存重叠。如下图,内存拷贝的两种情况:第一种情况下,拷贝重叠的区域不会出现问题,内容均可以正确地被拷贝。第二种情况下,问题... 查看详情

在c语言进行编程中,为啥要释放旧内存?

hstring*sub先声明了一个指针,我看别人的程序,为什么接下来就把这个指针的内存给释放了(if(sub->ch)free(sub->ch);/*释放旧空间*/),之后再使用malloc函数重新给它分配内存,为什么要这样做呢?不是多此一举吗?我们老师说的是... 查看详情

git:恢复一个已经在提交中被删除的文件

...家照顾一下~这里要研究的问题是,如果我们在之前的某一个提交中删除了一个文件,如何使用git将此文件恢复出来。首先我们要做的是找到当时删除的这个文件对应的提交。比较简便的方法是使用一些图形化的Git软件,可以直... 查看详情

valgrindc++内存泄漏检测(代码片段)

...泄漏有分配,没有释放malloc/new/new[]和free/delete/delete[]使用混搭两次释放内存LinuxValgrind使用1、下载源码 https://sourceware.org/pub/valgrind/valgrind-3.17.0.tar.bz22、解压包安装 tar-jxvfvalgrind-3.17.0.tar.bz2cdvalgrind-3.17.0./configuremakesudomakeinstall3... 查看详情