相关疑难解决方法(0)

为什么这样做:从std :: string函数返回C字符串文字并调用c_str()

我们最近在大学里做了一个讲座,我们的教授告诉我们在使用不同语言编程时需要注意的不同事项.以下是C++中的一个示例:

std::string myFunction()
{
    return "it's me!!";
}

int main(int argc, const char * argv[])
{
    const char* tempString = myFunction().c_str();

    char myNewString[100] = "Who is it?? - ";
    strcat(myNewString, tempString);
    printf("The string: %s", myNewString);

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

这会失败的原因是return "it's me!!"使用char []隐式调用std :: string构造函数.该字符串从函数c_str()返回,函数返回指向数据的指针std::string.

由于函数返回的字符串未在任何地方引用,因此应立即取消分配.这就是理论.

但是,让这段代码运行没有问题.很想知道你的想法.谢谢!

c++

43
推荐指数
2
解决办法
4528
查看次数

C++破坏表达式中的临时对象

给出以下代码:

#include <iostream>

struct implicit_t
{
    implicit_t(int x) :
        x_m(x)
    {
        std::cout << "ctor" << std::endl;
    }

    ~implicit_t()
    {
        std::cout << "dtor" << std::endl;
    }

    int x_m;
};

std::ostream& operator<<(std::ostream& s, const implicit_t& x)
{
    return s << x.x_m;
}

const implicit_t& f(const implicit_t& x)
{
    return x;
}

int main()
{
    std::cout << f(42) << std::endl;

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

我得到以下输出:

ctor
42
dtor
Run Code Online (Sandbox Code Playgroud)

虽然我知道这是正确的,但我不确定为什么.有没有stdc ++知识的人可以向我解释一下?

c++ constructor destructor temporary-objects

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

为什么分配不相关的字符串会导致另一个字符串被修改?

下面的例子中,我将fn作为指向常量c-string的const指针.当我声明并将不相关的其他const指针分配给不同的常量c-string时,原始fn会被修改.我一直在试图找出原因,但看不出可能导致这种情况的原因是什么?

输出:

原始fn:sampleStrWithExtension

修改后的fn:randomStr2ModifiedFn

int main() {
        std::string baseString = "sampleStr";
        std::string randomBaseString = "randomStr2";
        const char* const fn = (baseString + "WithExtension").c_str();
        std::cout << "Original fn: " << fn << std::endl;
        const char* const variableNotFn = (randomBaseString + "ModifiedFn").c_str();
        std::cout << "Modified fn: " << fn << std::endl;
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

c++

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

标签 统计

c++ ×3

constructor ×1

destructor ×1

temporary-objects ×1