这已成为困扰我多年的事情.
我们都在学校(至少,我是)教过你必须释放每个分配的指针.不过,我有点好奇,关于不释放内存的实际成本.在一些明显的情况下,就像在malloc循环内部或线程执行的一部分中调用时一样,释放是非常重要的,因此没有内存泄漏.但请考虑以下两个例子:
首先,如果我的代码是这样的:
int main()
{
char *a = malloc(1024);
/* Do some arbitrary stuff with 'a' (no alloc functions) */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里真正的结果是什么?我的想法是,进程死了,然后堆空间无论如何都没有了,因此错过调用没有任何害处free(但是,我确实认识到无论如何都要将它关闭,可维护性和良好实践的重要性).我对这个想法是对的吗?
其次,假设我的程序有点像shell.用户可以声明类似的变量,aaa = 123并将其存储在某些动态数据结构中供以后使用.很明显,你可以使用一些解决方案来调用一些*alloc函数(hashmap,链表,类似的东西).对于这种程序,在调用之后永远自由是没有意义的,malloc因为这些变量必须在程序执行期间始终存在,并且没有好的方法(我可以看到)用静态分配的空间来实现它.拥有一堆已分配但仅作为流程结束的一部分释放的内存,这是不好的设计吗?如果是这样,有什么替代方案?
在setup.py中,我已经指定了package_data,如下所示:
packages=['hermes'],
package_dir={'hermes': 'hermes'},
package_data={'hermes': ['templates/*.tpl']},
Run Code Online (Sandbox Code Playgroud)
我的目录结构粗略
hermes/
|
| docs/
| ...
| hermes/
|
| __init__.py
| code.py
| templates
|
| python.tpl
|
| README
| setup.py
Run Code Online (Sandbox Code Playgroud)
问题是我需要在源代码中使用templates目录中的文件,这样我就可以写出python代码(这个项目是一个解析器生成器).我似乎无法弄清楚如何正确地包含和使用我的代码中的这些文件.有任何想法吗?
在大多数现代shell中,您可以点击向上和向下箭头,它会在提示符下放置您执行的先前命令.我的问题是,这是如何工作的?!
在我看来,shell以某种方式操纵stdout来覆盖它已经编写的内容?
我注意到像wget这样的程序也可以这样做.有人知道他们是怎么做到的吗?
我正在编写一个充当非常基本的HTTP客户端的小类.作为我正在进行的项目的一部分,我正在让它识别cookie.但是,我不清楚当我的客户端收到多个具有相同密钥但设置了不同值的"Set-Cookie"标头时会发生什么.
例如,
Set-Cookie: PHPSESSID=abc; path=/
Set-Cookie: PHPSESSID=def; path=/
Set-Cookie: PHPSESSID=ghi; path=/
Run Code Online (Sandbox Code Playgroud)
其中哪一项应该是PHPSESSID的价值?当您在同一页面上调用session_start()然后调用session_regenerate_id()时,通常会发生这种情况.每个都会设置自己的标题.所有的浏览器似乎都没有这个,但我似乎无法让我的客户选择正确的.
有任何想法吗?!
我撞墙了.有没有人知道一个好的文本编辑器,它有像Notepad ++一样的搜索和替换,但也可以进行多行正则表达式搜索和替换?基本上,我试图找到一些可以匹配正则表达式的东西:
搜索oldlog\(.*\n\s+([\r\n.]*)\);
替换newlog\(\1\)
有任何想法吗?
我正在编写一个类似于shell的程序.启动后,会出现提示并输入一些特定于应用程序的命令.
到目前为止这个工作正常.但是,我想在Bash中添加对命令历史记录的支持,因此用户可以点击向上或向下箭头并查看以前输入的命令.
我已经包含了ncurses库,我用getch()做了一个简单的hello world测试,以确保正确报告向上和向下箭头.
困扰我的是,似乎要求我调用initscr()来清除屏幕以便我使用getch().
好的,问题是:
有没有人知道如何使用ncurses getch()函数而不先调用initscr()?如果没有,我可以让它不清楚屏幕吗?基本上,我希望getch()的行为与getchar()相同,如果这有意义的话.
提前致谢!
编辑:我认为最好的例子是Python如何在交互模式下运行.
好的,我在这里看过很多关于C中奇怪的习语和常见做法的帖子,这些帖子可能最初并不直观.也许有几个例子是有序的
数组中的元素:
#define ELEMENTS(x) (sizeof (x) / sizeof (*(x)))
Run Code Online (Sandbox Code Playgroud)
a[5] = 5[a]
Run Code Online (Sandbox Code Playgroud)
#define FOO(X) do { f(X); g(X); } while (0)
#define FOO(X) if (1) { f(X); g(X); } else
Run Code Online (Sandbox Code Playgroud)
我对专家C程序员的问题是:在C代码中有哪些成语,实践,代码snippits或鲜为人知的事实,但可能不是很直观,但是对C编程提供了很好的洞察力?
我正在做一些需要一个前瞻标记的解析.我想要的是一个快速函数(或类?),它将采用迭代器并将其转换为表单中的元组列表(token,lookahead),这样:
>>> a = ['a', 'b', 'c', 'd']
>>> list(lookahead(a))
[('a', 'b'), ('b', 'c'), ('c', 'd'), ('d', None)]
Run Code Online (Sandbox Code Playgroud)
基本上,这对于在这样的迭代器中展望是很方便的:
for (token, lookahead_1) in lookahead(a):
pass
Run Code Online (Sandbox Code Playgroud)
虽然,我不确定在itertools中是否有这个技术或功能的名称已经会这样做.有任何想法吗?
谢谢!
我很好奇,有人知道在C中进行正则表达式匹配的好方法吗?我能想到的唯一方法是通过Flex.这是唯一的方式还是有更好的方法?
谢谢!