我想我可能会在这里创建内存泄漏:
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在购买时使用了关键字......这有什么不同吗?
我很高兴地问我的教授,他似乎没有.:/
编辑:我不敢相信我没有使用循环,但谢谢,我学到了一些关于我术语的新知识!
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字节的内存,在这种情况下我可以使用哪种替代方法?
目标:管理一个 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) 可能有任何理由:
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的多个副本?
我看到了这个证据.
我有一个简单的函数,在它返回后,更改了数组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) 我使用SendGrid官方PHP库和SMTP API(自动邮件程序在Ubuntu服务器上作为cron作业运行)构建了一个自动邮件程序.
生产服务器上的内存限制设置为32M,但在生产服务器上第一次运行应用程序之一时,我收到了消息
允许的内存大小为33554432字节耗尽,wast尝试分配256478字节
自256478 <33554432以来,这根本没有任何意义,但我怀疑我在某处有内存泄漏.
根据这篇文章,PHP有内存泄漏问题,在处理对象之间的相互关系时,我使用自己的Wrapper类来使代码更具可读性和结构,主要的mailService类,以及每个任务的类,实现一个接口,并返回每封电子邮件的所有特定数据(标题,子值,收件人列表).
我将首先在我的界面和每个类中添加一个析构函数,以确保没有内存泄漏,但我不确定这是否会解决问题,因为根据我执行的内存基准测试,大部分执行时间,内存由SwiftMailer的MailTransport.php类消耗.
所以我的问题基本上,我怎么能在每次迭代时重置这个类的内存使用情况?,是否有内置的东西,或者我应该自己实现这样的方法?
非常感谢任何帮助.
小可视化:
我必须为家庭作业创建一个重载的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) 以下代码根据我如何定义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()它工作正常.我能理解我做错了什么.有帮助吗?
我一直试图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) 我正在尝试打印每个像素的值,但是它会给出错误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)
这是某种内存分配问题吗?
c++ ×5
c ×2
java ×2
memory-leaks ×2
pointers ×2
class ×1
enums ×1
malloc ×1
memory ×1
opencv ×1
optimization ×1
performance ×1
php ×1
precision ×1