【问题标题】:Should I recycle pointer and references or create new ones?我应该回收指针和引用还是创建新的?
【发布时间】:2017-01-05 19:46:37
【问题描述】:

我对处理 C 中的指针有疑问。 在我的程序执行过程中,我必须打开和关闭一个配置文件,但由于不同的程序更新了它的内容,我必须在程序运行时多次执行此操作。所以我做了一个小函数来读取文件并关闭它,每次我需要它时我都会调用它。

int readConfigFile()
{
    FILE* pfile = fopen("path to file", "r");
    fseek(pFile, 0, SEEK_END);
    lSize = ftell(pFile);
    rewind(pFile);

    text = (char*)malloc(sizeof(char) * lSize);
    if (text == NULL) {
        fputs("Memory error", stderr);
        return (0);
    }
    if (fread(text, 1, lSize, pFile) <= 0) {
        printf("Nothing read");
        return 0;
    }

    text[lSize] = '\0';
    //Do the actual reading
}

如果我没记错的话,这个函数每次运行时都会创建一个新的 FILE* 指针,但是我想知道是否使用具有更大范围的 FILE* 指针并在每次函数运行时回收它会更好。含义:

FILE* globalVaraible;
int readConfigFile(FILE* pFile)
{
    *pfile = fopen("path to file", "r");
    //Do some stuff here
}

我担心,因为据我所知,C++ 中没有垃圾收集器,如果运行时间足够长,第一个函数会创建太多的 FILE* 指针,并溢出我的内存。另一方面,拥有一个全局指针,它将在单个函数的上下文中打开和关闭,这似乎相当浪费并且不是非常模块化,至少在我看来。

那么我应该回收我的指针或任何与此相关的引用,还是可以根据需要声明新的指针?

提前致谢。

【问题讨论】:

  • 我不会在c++中使用任何这些
  • 这是 C 题还是 C++ 题?答案略有不同。
  • 仅供参考,您不能回收参考。一旦初始化,就永远无法更改。
  • 拜托,拜托,请停止处理此代码,get a good C++ book,并在继续之前实际学习该语言。你在这里写的是古老的 C 风格的代码,没有人应该再写了。您的问题表明您不了解静态、自动和动态存储中对象的生命周期。
  • @StephanLechner 可能违反了提问者应该对他们所询问的主题有最低限度的了解这一潜规则。事实上,这个问题显示出对手头主题的足够误解,对 OP 有价值的答案必须解决变量生命周期的工作方式、指针之间的差异以及它们指向的内容,以及可能还有 RAII 和 C++ 流,最重要的是解释了为什么他们不应该在高级别的缓冲区中使用 malloc,他们应该应该使用什么以及为什么他们甚至不想要这里的缓冲区。换句话说,一个好的答案太长了。

标签: c file pointers


【解决方案1】:

你可以使用freopen()。

http://en.cppreference.com/w/cpp/io/c/freopen

无法保证它实际上会重用为“旧”文件分配的动态内存。该函数也可以是fclose() 和fopen() 的包装器——它的所有实现都已定义。

据我所见,newlib(一个流行的嵌入式目标库)重用了 FILE 存储,所以这里有一点好处。它是否会产生明显的差异是另一回事。

https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;a=blob;f=newlib/libc/stdio/freopen.c;h=fb1f6c4db3f294f672d7e6998e8c69215b7482c1;hb=HEAD

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多