为什么当我将涉及“字符串”的代码放入函数中时会崩溃?

问题描述 投票:0回答:1

所以我尝试在 C++ 中运行一个简单的程序,它基本上是使用 C++

length()
库中的
<string>
函数来计算符号数量

这是我的自定义函数

#include <iostream>
#include <string>
using namespace std;

string TrimTextFunction() {
    string Text = "Hello I am your program!";

    cout << "String size is: " << Text.length();

    return 0; 
} 

然后,我只需通过 Visual Studio 中的调试器在

main ()
方法中运行此自定义函数

int main()
{
    cout << TrimTextFunction(); 
}

最终,我收到以下错误代码:

Exception thrown at 0x00007FFE67837A41
ucrtbased.dll

然后,它会将我重定向到名为“

xstring
”的内部文件,显示错误本身

没有调试器,代码会返回我需要的值

但是当我使用相同的调试器(或不使用)在

main()
函数中运行相同的代码时,它没有任何错误

#include <iostream>
#include <string>
using namespace std; 


int main()
{
    string Text = "Hello I am your program!";

    cout << "String size is: " << Text.length();
}

我似乎缺少一些关于自定义函数的东西,特别是当我调试某些东西时

所以我的问题是:为什么主函数可以让我得到我需要的没有错误的结果,而自定义函数却不能?

我使用了自定义函数,我需要期望一个字符串结果,该结果返回字符串变量的长度,即 24

c++ string crash
1个回答
3
投票

你的函数定义为

string TrimTextFunction() {
    string Text = "Hello I am your program!";

    cout << "String size is: " << Text.length();

    return 0; 
} 

在本例中,使用

0
构造
std::string
正在调用构造函数

std::string(const char* s, const Allocator& alloc = Allocator())

使用 s 指向的空终止字符串的副本来构造内容初始化的字符串。字符串的长度由第一个空字符确定。 如果 [s, s + Traits::length(s)) 不是有效范围(例如,如果 s 是空指针),则行为未定义。如果要推导的分配器类型不符合分配器的条件,则此构造函数不用于类模板参数推导。

请注意,从 C++23 开始,此构造函数被声明为已删除,因此甚至无法编译

std::string(std::nullptr_t) = delete;

如果您只想将辅助函数输出到 stdout,那么它不需要返回任何内容,因此返回类型将为

void
并且您可以省略
return
语句

void TrimTextFunction() {
  string Text = "Hello I am your program!";

  cout << "String size is: " << Text.length();
} 

int main() {
  TrimTextFunction(); 
}
© www.soinside.com 2019 - 2024. All rights reserved.