标签: memory-management

细微的记忆泄漏,这是常见的做法吗?

我想我可能会在这里创建内存泄漏:

   void commandoptions(){
      cout<< "You have the following options: \n 1). Buy Something.\n  2).Check you balance. \n3). See what you have bought.\n4.) Leave the store.\n\n Enter a number to make your choice:";
      int input;
      cin>>input;
      if (input==1) buy();
      //Continue the list of options.....
      else
      commandoptions(); //MEMORY LEAK IF YOU DELETE THE ELSE STATEMENTS!
   }

inline void buy(){
    //buy something
    commandoptions();
}
Run Code Online (Sandbox Code Playgroud)

假设命令选项刚刚在程序运行时首次出现.用户选择"1",表示由commandoptions()子例程执行buy()子例程.

在执行buy()之后,它再次调用commandoptions().

第一个命令选项()是否会返回?或者我只是做了内存泄漏?

如果我创建一个除了调用自身之外什么都不做的子例程,它将导致堆栈溢出,因为该子例程的其他"循环"永远不会退出.我在这做/接近这样做吗?

请注意,我inline在购买时使用了关键字......这有什么不同吗?

我很高兴地问我的教授,他似乎没有.:/

编辑:我不敢相信我没有使用循环,但谢谢,我学到了一些关于我术语的新知识!

c++ memory-leaks memory-management

0
推荐指数
3
解决办法
415
查看次数

在类实例之间共享的类中的`enum`定义,还是为每个实例复制?

class MyClass
{
    public:
        enum ErrorCodes
        {
            ERR_SUCCESS     = 1,
            ERR_READ        = 2,
            ERR_WRITE       = 3,
            // ...
            ERR_ALLOCATE    = 99,
            ERR_DELETE      = 100
        };

        ErrorCodes DoSomething();
};

MyClass::ErrorCodes MyClass::DoSomething()
{
    // ...
    return ErrorCodes::ERR_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

在我的示例代码中有一个非常长的enum定义,其中包含100个变量.假设每个变量保存4个字节的内存,enum则将使用400个字节的内存.一旦我开始创建这个类的对象会发生什么?因此,每个对象是否会消耗额外的400字节内存enum,或者是否会在此类的enum所有对象之间共享,因此无论初始化的类实例数是多少,都将使用仅固定的400字节?

如果要为每个实例使用400字节的内存,在这种情况下我可以使用哪种替代方法?

c++ optimization enums memory-management class

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

为什么我无法管理~382MB的内存?

目标:管理一个 unsigned long tomBOLA[5][10000000];

$top 给我:

top - 14:05:35 up  4:06,  4 users,  load average: 0.46, 0.48, 0.44
Tasks: 182 total,   1 running, 180 sleeping,   1 stopped,   0 zombie
Cpu(s): 14.4%us,  2.4%sy,  0.0%ni, 82.5%id,  0.6%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   3092064k total,  1574460k used,  1517604k free,   168944k buffers
Swap:  1998840k total,        0k used,  1998840k free,   672756k cached
Run Code Online (Sandbox Code Playgroud)

程序有一个大小为(5*10000000)*8bytes = 382MB的malloc,然后用0填充并读取存储在tomBOLA中的内容:

long int **tomBOLA;

if((tomBOLA=(long int **)malloc(5))==NULL){ /*MALLOC()*/
    printf("\n\tMEMORY ERROR-1");
    exit(1);
}
for(i=0;i<5;i++){
    if((tomBOLA[i]=(long int *)malloc(10000000*sizeof(long int)))==NULL){
        printf("\n\tMEMORY ERROR-2");
        exit(1);
    }
} …
Run Code Online (Sandbox Code Playgroud)

c pointers memory-management

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

Malloc似乎比新的[]使用更少的内存

可能有任何理由:

new X[n];
Run Code Online (Sandbox Code Playgroud)

与以下相比会消耗更多内存:

X* x = reinterpret_cast<X*>(malloc(n * sizeof(X))
for(X* p = x; p != x + n; ++p)
    new (p) X();
Run Code Online (Sandbox Code Playgroud)

多个n的多个副本?

我看到了这个证据.

c++ memory malloc memory-management

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

C函数参数值自行更改

我有一个简单的函数,在它返回后,更改了数组a [](作为参数传递)的值.问题是它们甚至没有写在函数中,只读 - 据说,至少 - .希望你能帮助我:

double *bhaskara(double a[]){
    double A = a[2], B = a[1], C = a[0];
    double raizes[2];
    double delta = B*B - 4*A*C;
    if(delta<=0){//ignora delta para pegar soh a parte inteira das raizes
        raizes[0] = -B/(2*A);
        raizes[1] = raizes[0];
    }else{
        raizes[0] = (-B+sqrt(delta))/(2*A);
        raizes[1] = (-B-sqrt(delta))/(2*A);
    }
    return raizes;
}
Run Code Online (Sandbox Code Playgroud)

c precision memory-management

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

适用于php的体面内存分析工具

我使用SendGrid官方PHP库和SMTP API(自动邮件程序在Ubuntu服务器上作为cron作业运行)构建了一个自动邮件程序.

生产服务器上的内存限制设置为32M,但在生产服务器上第一次运行应用程序之一时,我收到了消息

允许的内存大小为33554432字节耗尽,wast尝试分配256478字节

自256478 <33554432以来,这根本没有任何意义,但我怀疑我在某处有内存泄漏.

根据这篇文章,PHP有内存泄漏问题,在处理对象之间的相互关系时,我使用自己的Wrapper类来使代码更具可读性和结构,主要的mailService类,以及每个任务的类,实现一个接口,并返回每封电子邮件的所有特定数据(标题,子值,收件人列表).

我将首先在我的界面和每个类中添加一个析构函数,以确保没有内存泄漏,但我不确定这是否会解决问题,因为根据我执行的内存基准测试,大部分执行时间,内存由SwiftMailer的MailTransport.php类消耗.

所以我的问题基本上,我怎么能在每次迭代时重置这个类的内存使用情况?,是否有内置的东西,或者我应该自己实现这样的方法?

非常感谢任何帮助.

小可视化:在此输入图像描述

php memory-leaks memory-management

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

使用delete []和重载+ =的c ++堆损坏

我必须为家庭作业创建一个重载的String类.我在测试一些运算符时遇到了问题:

int main() {
    MyString i;
    cin >> i;
    cin.ignore(100, '\n');
    MyString temp = i;
    while(!(i > temp)) {
        temp += i;
        cin >> i;
        cin.ignore(100, '\n');
    }
    cout << endl << temp;
    return 0;
}

MyString operator+= (const MyString& op1) {
    _len += (op1._len);
    char* temp = new char[_len+1];
    strcpy(temp, _str);
    strcat(temp, op1._str);
    if(_str) {
        delete [] _str;
        _str = NULL;
    }
    _str = new char(_len+1);
    strcpy(_str, temp);
    return *this;
}

istream& operator>> (istream& inStream, MyString& in) {
    char …
Run Code Online (Sandbox Code Playgroud)

c++ memory-management heap-corruption

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

C++动态内存分配问题

以下代码根据我如何定义newImagesData给出了seg.fault(参见下面的注释).如果它的数组一切正常,但如果定义为指针 - 错误:(

//Mat newImagesData[FIFO_SIZE]; // Mat is a class from opencv
Mat* newImagesData;

void func1( )
{
    ...
    newImagesData = (Mat*)malloc(FIFO_SIZE * sizeof(Mat)); //if *newImagesData
    fifoInit(&newImagesFB, newImagesData, FIFO_SIZE);
    ...
}

void fifoInit(FIFOBuffer* fifo, Mat* imageData, int size)
{
    fifo->data = imageData;
    fifo->end = 0;
}

void fifoWrite(FIFOBuffer* fifo, Mat* frame)
{
    fifo->data[fifo->end] = *frame; // seg fault with *newImagesData ; OK with newImagesData[]
    memcpy(&fifo->data[fifo->end], frame, sizeof(Mat)); // OK with *newImagesData
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果我使用memcpy()它工作正常.我能理解我做错了什么.有帮助吗?

c++ opencv pointers memory-management

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

在Java中使用WeakReferences

我一直试图WeakReference在我的Android项目中使用,但我从来没有取得任何成功.现在我真的需要它,因为我正在处理旧设备,我必须尽可能地保持内存清洁.

无论如何,我有一个数组,其中包含大约1000个不同字符串列表.我需要加载它,然后在其中找到一个字符串.

这就是我目前使用它的方式:

String[] campaignList = context.getResources().getStringArray(R.array.campaignList);
WeakReference<String[]> weakCampaignList = new WeakReference<String[]>(campaignList);
Run Code Online (Sandbox Code Playgroud)

这是正确的使用方式WeakReference吗?如果是,那么我不明白的是阵列正在水合,String[]然后我把它传递给了WeakReference.那么这是不是意味着我在分配给一个阵列的内存上有2个点?或者我完全误解了这个WeakReference概念?

我在所有资源中发现的一个非常好的资源就是这个:

http://neverfear.org/blog/view/150/Strong_Soft_Weak_and_Phantom_References_Java

编辑:

我的代码没有问题.只需要知道我在性能方面是否正确.

for (int i = 0; i < weakCampaignList.get().length; i++) {
  Log.d(TAG,"weakCampaignList: "+weakCampaignList.get()[i]);
}
Run Code Online (Sandbox Code Playgroud)

我的整个方法

public static String getTheCampaign(String country, Context context) {
        String campaign = "";
        campaign = "annual_subscription_" + country;

        String[] campaignList = context.getResources().getStringArray(
                R.array.campaign_list);

        ArrayList<WeakReference<String>> weakCampaignList = new ArrayList<WeakReference<String>>();
        for (String s : campaignList) {
            weakCampaignList.add(new WeakReference<String>(s));
        }

        if (country.equals("") || …
Run Code Online (Sandbox Code Playgroud)

java performance memory-management weak-references

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

正确分配内存后,Java代码会出错

我正在尝试打印每个像素的值,但是它会给出错误p = 300.之前p = 300,所有像素都打印出来.

orignal.getHeight() = 344;orignal.getWidth() = 300;.

BufferedImage binarized = new BufferedImage(original.getWidth(), original.getHeight(), original.getType());
int p, q;

System.out.println(original.getHeight() + "," + original.getWidth());

for(p=0;p<original.getHeight();p++)
{
    for(q = 0; q < original.getWidth(); q++)
    {
        //System.out.println("goint to get pixel"+"("+p+","+q+")");
        int Pixel = binarized.getRGB(p, q);
    }
}
Run Code Online (Sandbox Code Playgroud)

错误信息:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds!
    at sun.awt.image.ByteInterleavedRaster.getDataElements(ByteInterleavedRaster.java:318)
    at java.awt.image.BufferedImage.getRGB(BufferedImage.java:888)
    at Binarization.binarize(Binarization.java:137)
        at Binarization.main(Binarization.java:20)
Run Code Online (Sandbox Code Playgroud)

这是某种内存分配问题吗?

java memory-management

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