我在以下目标c代码中遇到内存泄漏问题.的粗体带星号(***
)线与内存泄漏(在仪器提到的)的行.有什么想法吗?谢谢.
- (UIImage*)part:(float)part ofImage:(UIImage*)imgObject withMask:(UIImage*)imgMask {
UIImage *imgResult = nil;
CGRect rcMask = CGRectMake(0.0f, 0.0f, imgMask.size.width, imgMask.size.height);
CGRect rcObject = CGRectMake(0.5f * (rcMask.size.width - imgObject.size.width), 0.0f, imgObject.size.width, imgObject.size.height * part);
BytePtr pictureData = (BytePtr)malloc(rcMask.size.width * rcMask.size.height * 4);
CGContextRef pictureContext = CGBitmapContextCreate(pictureData, rcMask.size.width, rcMask.size.height,8, rcMask.size.width * 4,CGImageGetColorSpace(imgObject.CGImage), kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGContextClipToMask(pictureContext, rcMask, imgMask.CGImage);
CGImageRef imgInRect;
imgInRect = CGImageCreateWithImageInRect(imgObject.CGImage, rcObject);
CGContextDrawImage(pictureContext, rcObject, imgInRect);
CGImageRelease(imgInRect);
***imgResult = [UIImage imageWithCGImage:CGBitmapContextCreateImage(pictureContext)];***
CGContextRelease(pictureContext);
free(pictureData);
return imgResult;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用仪器工具来查找代码中的泄漏.
工具指示下线100%泄漏.
NSArray*subviews = [[cell subviews] copy];
如何在上面的代码中解决泄漏问题?
提前致谢.
这是我上一个问题的后续内容: C++完全系统崩溃,仅发布模式
基本上我有一个树状数据结构,在Release模式下,它完全冻结了操作系统.这是由于内存分配突然激增,超出了操作系统可以处理的范围.
这看似内存泄漏(它是,但在一分钟内更多)是非常奇怪的,因为我有所有必要的代码来初始化指向NULL并最终分配它们(必要时)如果它们被发现是NULL.在调试模式下,确认了这个正确的行为,并且事情分配正常(我可以看到调试器中的NULL指针设置为零).
但在发布模式中,情况有所不同.构造函数被完全跳过,并且所有类的内部都被初始化为随机垃圾.这会导致指针变得混乱,这就是内存被分配的地方,直到整个系统崩溃.
为什么Release模式忽略了我的构造函数?
我在Windows 7上使用Visual Studio 2010顺便说一句.
在xcode中运行分析工具后,我得到以下记忆泄漏
//Getting memeory leak warning here "Potential leak of an object allocated and stored into 'phones'
ABMultiValueRef phones = ABRecordCopyValue(ref, kABPersonPhoneProperty);
//Getting potential leak error for line below
if (ABMultiValueGetCount(ABRecordCopyValue(ref, kABPersonPhoneProperty))!=0)
{
//Getting potential leak error for line below
CFStringRef pNumber = ABMultiValueCopyValueAtIndex(phones,0);
phoneNumber = [NSString stringWithFormat:@"%@", (NSString *)pNumber];
NSString *contactFirstLast = [NSString stringWithFormat: @"%@ %@", firstName, lastName];
}
Run Code Online (Sandbox Code Playgroud)
我该如何解决这些泄漏?
我最近在.NET本机加密服务提供程序中遇到了一些内存泄漏问题,因为它依赖于非托管代码.我在SO上遇到的唯一另一件事就是这篇文章,但它没有得到太多细节,更不用说提供一个好的罪魁祸首了.
是的,如果它实现了IDisposable,它可能会在某个地方使用一些非托管资源,但是我想把一个列表放在一起,通常使用的是特定类,而不是简单地在Intellisense中查找Dispose.
我遇到的那些给我带来麻烦的是:
其他依赖非托管资源的人是谁知道的?是否有任何特别阴险的那些看起来像是完全管理但不是?提前致谢.
我有以下函数,它是从连续运行的Thread的run()连续调用的.
private LinkedList<short[]> playerData = new LinkedList<short[]>();
public synchronized void setPlayerData(short[] buffer) {
// Log.i(LOG_TAG, "Inside setData..");
playerData.addLast(buffer);
if (playerData.size() > 10) {
// Log.i(LOG_TAG, "playerData not empty");
playerData.removeFirst();
}
}
Run Code Online (Sandbox Code Playgroud)
现在DDMS的分配跟踪器说在addLast()中创建了很多对象(实际上在addLastImpl()内部),所以我想明确地删除这些数组,以便它们在Heap中总是足够的内存.现在,
有关LogCat的信息,请参阅链接,这是我解决整个synarion的另一个问题.在这个主题中,我只是试图通过将它分成一小部分问题来解决这个更大的问题.
可能的解决方案可能的解决方案是通过删除不需要的数组来释放内存空间.但是在Java中我们如何释放new
运算符创建的数组呢?即
short[] buffer = new short[320];
// do some operation on buffer
/// now how can I explicitly free memory by deleting the buffer, when its job is over..
Run Code Online (Sandbox Code Playgroud)
我知道有垃圾收集来处理所有这些事情.但是在我的应用程序中,GC_CONCURRENT一直在吃掉.由于这个原因,其他过程也很匮乏.如果我能够显式释放内存,即在C++中删除,那将是很棒的.您可以在此处查看LogCat信息... 有关我的问题的详细问题
编辑2 3.将数组指定为null
这有什么用呢?null数组将被安排到垃圾收集,我想避免,因为从一个线程连续调用该方法(每20毫秒).如果我将数组赋值为null,GC_FOR_MALLOC消息将填充LogCat ...
我有一个简单的程序,只用数字填充数组并打印每个数字.
但是,valgrind声称至少有8000字节的内存泄露.
int main(int argc, char *argv[])
{
int numbers[10];
int i = 0;
for(i = 0; i < 10; i++)
{
numbers[i] = i;
printf("%d",numbers[i]);
}
free(numbers);
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释内存泄漏的位置吗?
这是为阵列释放空间的正确方法吗?
我已经经历了几个有关相同错误代码的类似问题,最关心的是传递无效指针地址.但是,这看起来并非如此,因为我的程序正确地处理了传递的任何地址.
FORMAT_STRING:
static char *format_string(char *string)
{
int i;
if (string == NULL) {
return string;
}
string[0] = (char)toupper((int)string[0]);
111->for (i = 1; string[i] != '\0'; i++) {
if (!isalpha(string[i-1])) {
string[i] = (char)toupper((int)string[i]);
} else {
string[i] = (char)tolower((int)string[i]);
}
if (string[i] == '/' || string[i] == '\\') {
string[i] = ' ';
}
}
/* Remove End of string White Spaces */
while (string[--i]==' '); string[++i]='\0';
return string;
}
Run Code Online (Sandbox Code Playgroud)
metadata_extract:
static int metadata_extract(const char *filename, struct kw_metadata …
Run Code Online (Sandbox Code Playgroud) 假设我们想在C++中声明一个函数,我在其中声明一个局部变量,int p=new int [10];
然后我做了一些操作,最后我做了一些操作return p;
.
正如人们常说的那样,如果我们使用new
,我们必须delete
.但我想在这种情况下,我们不应该删除,对吧?否则,它根本不能返回p,对吧?但是,我也在考虑是否应该删除函数在测试时返回的项目int main()
.
我如何从他的代码中释放泄漏的内存.
struct object_one{
int value;
}*object,object_node;
struct node_one {
void **pointers;
}*node, node_node;
node sample(){
object number;
node node123;
node123 = malloc(sizeof(node_node));
number = malloc(sizeof(object_node));
number->valu = malloc(sizeof(int));
number->value = 9;
node123->pointers[0]=number;
free(number);
return node123;
}
Run Code Online (Sandbox Code Playgroud)
我正在以正确的方式释放所引用的内存.number
一旦我执行上述操作,我就会收到错误;
Invalid read of size 4
==15957== at 0x403804: main (abc.c:1255)
==15957== Address 0x540cb50 is 0 bytes inside a block of size 4 free'd
Run Code Online (Sandbox Code Playgroud)
请建议我如何在这种情况下防止内存泄漏?提前致谢.
[编辑]
嗨,实际上上面提到的不是我的真实代码.但我已经尽力重新选择代码的sturcutre和语义.实际上我正在实施数据架构.number
是一些临时存储,node123
是我真正的数据库.我想number
在数据库中分配值并取消引用它.number
type是数据库的一个组件.
[EDIT2]
对应于行的代码1255
是打印由.持有的值.object i'e value …