标签: strdup

strdup和内存泄漏

strdup是否每次都分配另一个内存区域并创建另一个指针?

例如:以下代码是否导致内存泄漏?

void x(char** d, char* s){
    *d = strdup(s);
}

int main(){
    char* test = NULL;
    x(&test, "abcd");
    x(&test, "etc");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c memory-leaks strdup

6
推荐指数
2
解决办法
7443
查看次数

怎样才能更安全地编写这个C片段?

我有以下C代码片段,必须识别错误并建议更安全地编写它的方法:

char somestring[] = "Send money!\n";
char *copy;

copy = (char *) malloc(strlen(somestring));

strcpy(copy, somestring);
printf(copy);
Run Code Online (Sandbox Code Playgroud)

所以错误是strlen忽略'\0'了字符串的尾随,因此不会为副本分配足够的内存,但是我不确定他们更安全地写它是什么?

我可以使用malloc(strlen(somestring)+1))我假设,但我认为必须有一个比这更好的方法?


编辑:好的,我接受了答案,我怀疑我们不会期待strdup解决方案,因为它不是ANSI C的一部分.这似乎是一个非常主观的问题,所以我不确定我是不是接受实际上是最好的.无论如何,谢谢你的所有答案.

c memory-management cstring strdup null-terminated

5
推荐指数
3
解决办法
433
查看次数

g ++与c ++ 0x的strdup错误

我有一些C++ 0x代码.我能够在下面重现它.下面的代码工作正常,-std=c++0x但我需要它为我的真实代码.

我如何在C++ 0x中包含strdup?与gcc 4.5.2

请注意我正在使用mingw.我尝试包括cstdlib,cstring,string.h并尝试使用std ::.没运气.

>g++ -std=c++0x a.cpp
a.cpp: In function 'int main()':
a.cpp:4:11: error: 'strdup' was not declared in this scope
Run Code Online (Sandbox Code Playgroud)

码:

#include <string.h>
int main()
{
    strdup("");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

gcc compiler-errors g++ strdup c++11

5
推荐指数
2
解决办法
1万
查看次数

如何避免"null参数需要非null null"编译器警告

编译以下代码:

#include <string.h>
#define FOO (NULL)

int main(int argc, char *argv[])
{
    char *foo;

    if (FOO)
        foo = strdup(FOO);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

导致以下编译器警告:

foo.c: In function ‘main’:
foo.c:9:3: warning: null argument where non-null required (argument 1) [-Wnonnull]
   foo = strdup(FOO);
   ^
Run Code Online (Sandbox Code Playgroud)

但是,strdup如果FOONULL因为if (FOO)检查将不会被调用.有没有办法避免这种警告?

谢谢!

c strdup gcc-warning

5
推荐指数
2
解决办法
1万
查看次数

char*范围在C++容器中

具有以下内容:

#include <set>

std::set<const char *> global = std::set<const char *>();
void x() {
    const char *c = "a";
    const char *d = "b";

    global.insert(c);
    global.insert(d);
}

int main() {
    x();
    for (std::set<const char *>::const_iterator iter=global.begin(), end=global.end(); iter!=end; ++iter) {
        printf("%s\n", *iter);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

最后,正如预期的那样,我收到ab打印出来.

然而,是否有任何保证,例如,如果该集合是一个bozo对象的一部分,那么它们一直持续到它bozo的生命周期结束?或者我必须strdup要确保字符串?

c++ containers cstring strdup

4
推荐指数
1
解决办法
724
查看次数

使用strdup()后将char*转换为int

使用后为什么strdup(value) (int)value返回不同的输出?如何获得相同的输出?

我的简短示例变坏了,请使用长的:这里是测试的完整代码:

#include <stdio.h>
#include <iostream>

int main()
{

    //The First Part
    char *c = "ARD-642564";
    char *ca = "ARD-642564";

    std::cout << c << std::endl;
    std::cout << ca << std::endl;

//c and ca are equal
    std::cout << (int)c << std::endl;
    std::cout << (int)ca << std::endl;


    //The Second Part
    c = strdup("ARD-642564");
    ca = strdup("ARD-642564");

    std::cout << c << std::endl;
    std::cout << ca << std::endl;

//c and ca are NOT equal Why?
    std::cout << (int)c << std::endl;
    std::cout …
Run Code Online (Sandbox Code Playgroud)

c c++ pointers type-conversion strdup

4
推荐指数
1
解决办法
790
查看次数

在哪里可以释放Bison/Flex中的内存?

我或多或少地使用Bison&Flex 1个月,所以如果我没有看到明显的东西(但我认为不是这样),我很抱歉.

我有一个关于使用Flex Bison释放内存的问题.这是我的代码的样子:

 parser.l

 {DATE}      { yylval.str= strdup(yytext);
             pair<string,string> newpair = make_pair("DATE",yytext);
             myvector.push_back(newpair);
              return TOKEN_DATE ;}
Run Code Online (Sandbox Code Playgroud)

这是我的.l文件的一个例子.我将yytext的值复制到yylval.str中.然后我创建一个具有该内容的新对(实际上是键/值),然后我返回bison的令牌日期.我的解析器.y不超过yyparse; 当抓到东西时,它就会打印出来.

我尝试在此运行valgrind,我有关于strdup的多个错误.我知道这个函数使用malloc,但我不知道WHERE和WHEN使用FREE.

我可能猜测它在.y文件中,但在哪里?

 test:
      TOKEN_DATE                 { cout << $1 << endl; // here ? and what to free ?}
Run Code Online (Sandbox Code Playgroud)

我真的没有得到所有这些,我真的很感激一个简单明了的解释.

提前致谢,


编辑:

我试过几件事:

 test:
      TOKEN_DATE TOKEN_TOTO TOKEN_BLABLA { cout << $1 << endl; free($1); free($2);}
    | TOKEN_DATE test { cout << $1 << endl, free($1); }
Run Code Online (Sandbox Code Playgroud)

它似乎编译和执行良好,但valgrind仍然告诉我,strdup函数中包含的malloc存在问题.但我不能在flex文件中写自由(yylval.str),否则,野牛不会意识到这个值(如果我理解正确,我试过它不起作用).我真的不知道如何消除这个泄漏的问题.

c++ memory-management bison strdup flex-lexer

4
推荐指数
2
解决办法
3333
查看次数

strdup():对警告感到困惑('隐式声明','使指针......没有强制转换',内存泄漏)

当我编译下面的一小段代码(我们在其中定义一个字符串,然后使用strdup进行复制)时,我得到3个警告:来自GCC的2个编译器警告和来自valgrind的1个运行时警告/错误.

我怀疑内存泄漏错误(由valgrind报告)也与我使用strdup有关,这就是我在下面包含相关输出的原因.

我究竟做错了什么?(我正在通过一本C书,这就是作者使用strdup的方式.)


代码:

#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[])
{
  char *string1 = "I love lamp";
  char *string2;

  string2 = strdup(string1);

  printf("Here's string 1: %s\n"
     "Here's string 2: %s\n",
     string1, string2);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

警告/输出:

dchaudh@dchaudhUbuntu:~/workspaceC/LearnCHW/Ex17_StructsPointers$ make test
cc -std=c99    test.c   -o test
test.c: In function ‘main’:
test.c:9:3: warning: implicit declaration of function ‘strdup’ [-Wimplicit-function-declaration]
   string2 = strdup(string1);
   ^
test.c:9:11: warning: assignment makes pointer from integer without a cast [enabled by default]
   string2 = strdup(string1);
           ^ …
Run Code Online (Sandbox Code Playgroud)

c valgrind strdup

3
推荐指数
2
解决办法
8666
查看次数

复制传递给函数的字符串作为C中的参数

我想不出我的问题的正确标题,所以在这里.我正在尝试学习C,以下代码来自我正在遵循的教程.

struct Person {
    char *name;
    int age;
    int height;
    int weight;
};

struct Person *Person_create(char *name, int age, int height, int weight){
    struct Person *who = malloc(sizeof(struct Person));
    assert(who != NULL);

    who->name = strdup(name);
    who->age = age;
    who->height = height;
    who->weight = weight;

    return who;
}

void Person_destroy(struct Person *who){
    assert(who != NULL);

    free(who->name);
    free(who);
}

int main(int argc, char *argv[]){
    struct Person *joe = Person_create("Joe Alex", 32, 64, 140);

    ........
Run Code Online (Sandbox Code Playgroud)

我的问题是Person_create功能为什么我们要复制name到新的内存位置who->name.为什么我们不能只who->name …

c string struct strdup

3
推荐指数
1
解决办法
81
查看次数

malloc + strdup是否会泄漏内存?

附:

char *x = malloc(1024);
strcpy(x, "asdf");
x = strdup(x);
free(x); // OK
free(x); // Segfault
Run Code Online (Sandbox Code Playgroud)

如果我只是释放一次,我还会泄漏吗?如果是这样,如何避免呢?

c memory malloc memory-management strdup

2
推荐指数
1
解决办法
908
查看次数