我的dll中的内存分配大小上限为20MB

时间:2018-07-04 04:45:21

标签: c++ c windows visual-studio dll

我在创建自己的DLL时遇到了麻烦(供学术人员使用。)

在DLL项目的标头中(编译选项为“ C”), 我声明了导出三个函数

// in dll1 header

#pragma once

#ifdef MYDLL
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif


MYDLL_API int Mmalloc(int**, int);
MYDLL_API int Mfree(int**);
MYDLL_API int Arrsum(int*, int);

它们只是简单的功能。

和DLL .C

 //in dll.c 

#include "dll1.h"
#include <stdlib.h>

int Mmalloc(int** mem, int n) // just memory Allocation
{
    *mem = (int*)malloc(sizeof(n)*sizeof(int));
    if (*mem) return 1; // if succeed return 1
    return 0;           // or return zero
};

int Mfree(int** mem) // just memory Free
{
    free(*mem);
    return 1;
}

int Arrsum(int* arr, int n) // just some operate
{
    int sum = 0;
    for (int i = 0; i < n; i++)
    {
        sum += arr[i];
    }
    return sum;
}

带有“预处理定义”->“ MYDLL”以及“运行库”->“ / MD” 我建造它。

,然后创建另一个项目(编译选项“ default(c ++)”) 从DLL标头添加添加标头,添加外部“ C”

#pragma once

#ifdef MYDLL
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif


extern "C"
{
    MYDLL_API int Mmalloc(int**, int);
    MYDLL_API int Mfree(int**);
    MYDLL_API int Arrsum(int*, int);
}

我还制作了main.cpp

#include <stdio.h>
#include <stdlib.h>
#include "dll1.h"

#define SZ 1000

int main()
{
    int* arr=0;
    int cnt = 0;
    while (1)
    {
        int ret = Mmalloc(&arr, SZ);
        printf(ret ? "YES\n" : "NO\n");

        for (int i = 1; i <= SZ; i++)
        {
            arr[i - 1] = i;
            printf("%d\n", arr[i - 1]);
        }

        printf("%d\n", Arrsum(arr, SZ));

        printf("cnt : %d\n", ++cnt);
        Mfree(&arr);
    }
};

然后将* .dll和* .lib文件放置在正确的文件夹中。 片刻对我来说似乎不错,但我发现了一个大错误。

我在main.cpp中使用了while(1)语法。 因此我的程序应该尽可能长时间地工作,但是它会在某些时候停止。

我不知道什么是真正的问题。

我更改了.dll项目以及main.cpp项目中的堆保留大小

但是我的主程序总是停止。

在调试模式下,它停止 .dll, break point trigger

或更大尺寸(SZ 10000〜100000)我有访问冲突 access violation

请帮助我。我什至无法想象真正的问题是什么。

dll中是否存在某些语法错误? (函数中的内存分配?) 要么 编译器问题? ,Windows?还是什么?...

1 个答案:

答案 0 :(得分:4)

Mmalloc分配4或8个整数(取决于系统上sizeof(n)的值),而不是n整数。然后,程序会通过缓冲区溢出表现出未定义的行为。