有没有人知道发现智能指针引起的内存泄漏的"技术"?我目前正在开发一个用C++编写的大型项目,该项目大量使用带引用计数的智能指针.显然我们有一些由智能指针引起的内存泄漏,它们仍然在代码中的某处被引用,因此它们的内存不会被释放.很难找到带有"不必要"引用的代码行,导致相应的对象不被释放(尽管它不再使用).
我在网上找到了一些建议,建议收集参考计数器的递增/递减操作的调用堆栈.这给了我一个很好的提示,哪一段代码导致参考计数器增加或减少.
但我需要的是某种算法将相应的"增加/减少调用堆栈"组合在一起.在删除这些调用堆栈之后,我希望(至少)剩下一个"增加调用堆栈",它向我显示带有"不必要"引用的代码段,这导致相应的对象不被释放.现在修复泄漏没什么大不了的!
但有人想知道进行分组的"算法"吗?
开发在Windows XP下进行.
(我希望有人理解,我试图解释......)
EDIt:我说的是循环引用造成的泄漏.
我的代码如下:
FILE *txt_file = fopen("data.txt", "r");
if (txt_file == NULL) {
perror("Can't open file");
}
Run Code Online (Sandbox Code Playgroud)
返回的错误消息是:
无法打开文件:没有这样的文件或目录
文件"的data.txt"肯定存在于工作目录(它存在于包含我的.c和.h文件的目录),所以为什么fopen()函数返回一个空指针?
我得到了一些代码,其中一些参数是指针,然后指针被解引用以提供值.我担心指针取消引用会花费周期,但在查看之前的StackOverflow文章之后:取消引用指针有多贵?,也许没关系.
这里有些例子:
bool MyFunc1(int * val1, int * val2)
{
*val1 = 5;
*val2 = 10;
return true;
}
bool MyFunc2(int &val1, int &val2)
{
val1 = 5;
val2 = 10;
return true;
}
Run Code Online (Sandbox Code Playgroud)
我个人更喜欢传递参考作为一种风格问题,但是一个版本(在处理周期方面)比另一个版本更好吗?
基本问题.
char new_str[]="";
char * newstr;
Run Code Online (Sandbox Code Playgroud)
如果我必须将一些数据连接到它或使用字符串函数如strcat/substr/strcpy,两者之间的区别是什么?
我知道我必须为char*方法分配内存(第2行).我不太确定如何.
const char*和字符串文字是一样的吗?
我需要了解更多.有人能指出一些不错的详尽内容/材料吗?
我在旧的C代码中看到了很多以下内容:
type_t *x = (type_t *) malloc(...);
Run Code Online (Sandbox Code Playgroud)
从那里malloc()开始返回指针的重点是什么void *?是因为较旧的C编译器不支持void指针而是malloc()习惯返回char *?
我最近对C编程感兴趣,所以我给自己写了一本书(K&R)并开始学习.
来自Java大学课程(基础知识),指针是一个全新的篇章,从我在线阅读的内容来看,这是一个相当困难的概念.在进入指针章节之前,我的印象是指针是C的主要部分,并提供了很大的好处.
在阅读本章并了解指针是什么以及它们如何工作时,这些好处对我来说并不明显.
例如(如果我完全错误,请纠正我)在K&R书中引用指针它说,因为我们通过值调用,当在函数调用中传递变量时,我们几乎传递了变量的副本函数处理,因此函数不能对原始变量做任何事情,我们可以用指针克服这个问题.
在稍后使用char指针的示例中,该书说增加char指针是合法的,因为该函数具有指针的私有副本."私人副本"不是使用指针的理由吗?
我想我对整个指针的使用有点困惑.如果被问到我可以使用指针而不是使用数组下标,但我怀疑这是指针的主要用途.
Linux和开源编程是我进入C的主要原因.我得到了一个C项目的源代码(Geany IDE),我可以看到在整个源代码中都使用了指针.
我也在论坛上做了一些搜索,发现了几个有类似问题的帖子.答案是(我引用):
如果您不知道何时应该使用指针,请不要使用它们.
当你需要使用它们时,每种情况都会有所不同.
我是否可以安全地避免在目前使用指针并且只在特定情况下使用它们(指针需要明显?)
内存是std::array连续的吗?以下是有效/良好的做法吗?
std::array<type1,Num> arr = //initialize value
type1 * ptr = &arr[0];
Run Code Online (Sandbox Code Playgroud)
我可以传递ptr给期望c风格数组的函数吗?
我无法找到指针数组的长度.比方说我有:
char array[40] = "hello"; // size 40
int length = sizeof array / sizeof array[0]; // no problem returns 40
Run Code Online (Sandbox Code Playgroud)
//如何仅使用指向该数组中第一个元素的指针来获取数组的长度?
char* pchar = array;
Run Code Online (Sandbox Code Playgroud)
//如果
std::strlen(pchar); // this returns the length of 5... i want length 40
Run Code Online (Sandbox Code Playgroud)
//如果
int count = 0;
while(true)
{
if(*(pchar + count) == '\0') // returns 5...
break;
count++;
}
Run Code Online (Sandbox Code Playgroud)
如何从指向数组中第一个元素的指针返回长度40?
我发现我可以做到这一点.
int count = 0;
while(true)
{
if(*(pchar + count) == '\0' && *(pchar + count + 1) != '\0')
break;
count++; …Run Code Online (Sandbox Code Playgroud) 我在背景图像下面有一个按钮.为了使按钮可单击,我添加了一个"指针 - 事件:无".但是,我还想要一个精灵图像,我在hover上更改背景图像,指针事件也会禁用.有没有办法保持元素的悬停属性,同时点击通过它?
当点击#cover_button时,我搜索并尝试了jquery unbind click并返回false,但它没有用.
这是我的代码.如果我保留指针事件:无,我可以单击背景图像下面的按钮.但这会禁用悬停属性.如果我将其删除,我将无法点击.
#cover_button {
pointer-event: none;
position: absolute;
width: 46px;
height: 24px;
left: 0;
top: 0;
background: url(http://s13.postimg.org/bqxlnbfs3/Like.png);
}
#cover_button:hover {
background: url(http://www.moronacity.com/tech-journal/images/2011/February/small-Facebook-like-button-counter.gif);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
这是一个小提琴:可点击但不可爱
http://jsfiddle.net/3PXTK/1/
这是另一个:Hoverable但不可点击(我刚删除指针事件:无) http://jsfiddle.net/3PXTK/
每当你研究进程的内存分配时,你通常会看到它如下所示:

到现在为止还挺好.
但是你有sbrk()系统调用,允许程序改变其数据部分的上限,它也可以用来简单地检查sbrk(0)的限制.使用该功能,我发现了以下模式:
模式1 - 小malloc
我在Linux机器上运行以下程序:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int globalVar;
int main(){
int localVar;
int *ptr;
printf("localVar address (i.e., stack) = %p\n",&localVar);
printf("globalVar address (i.e., data section) = %p\n",&globalVar);
printf("Limit of data section = %p\n",sbrk(0));
ptr = malloc(sizeof(int)*1000);
printf("ptr address (should be on stack)= %p\n",&ptr);
printf("ptr points to: %p\n",ptr);
printf("Limit of data section after malloc= %p\n",sbrk(0));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出如下:
localVar address (i.e., stack) = 0xbfe34058
globalVar address (i.e., data section) = 0x804a024 …Run Code Online (Sandbox Code Playgroud)