这是关于智能指针(例如唯一指针)的一个很好的答案:什么是智能指针,我应该何时使用?.
这是他们提供的一个示例,作为唯一指针的最简单用法:
void f()
{
{
std::unique_ptr<MyObject> ptr(new MyObject(my_constructor_param));
ptr->DoSomethingUseful();
} // ptr goes out of scope --
// the MyObject is automatically destroyed.
// ptr->Oops(); // Compile error: "ptr" not defined
// since it is no longer in scope.
}
Run Code Online (Sandbox Code Playgroud)
然而,这引出了一个问题:在这种情况下,目标是简单地删除对象(释放内存),当它超出范围时,唯一指针指向,为什么不把整个对象放在堆栈上呢? , 像这样??
void f()
{
{
MyObject myobj(my_constructor_param);
myobj.DoSomethingUseful();
} // myobj goes out of scope --
// and is automatically destroyed.
// myobj.Oops(); // Compile error: "myobj" not defined
// since it is no longer …Run Code Online (Sandbox Code Playgroud) Cppreference 指出,关于std::memcpy()(强调):
如果对象可能重叠或不可平凡复制,则 的行为
memcpy未指定并且可能未定义。
因此,我总是在使用之前检查以确保对象是可简单复制的memcpy(),如下所示:
#include <type_traits>
static_assert(std::is_trivially_copyable<T>::value, "Type T must "
"be a trivially-copyable type in order to guarantee that `memcpy()` is safe "
"to use on it.");
memcpy(&outputData, &data, sizeof(data));
Run Code Online (Sandbox Code Playgroud)
std::copy()然而,似乎没有这个限制:https://en.cppreference.com/w/cpp/algorithm/copy。
类型必须可简单复制才能不具有未定义行为的限制是否不适用于std::copy()?
另外,我刚刚在我的“placement new”答案中意识到,这让我想知道整个事情,我只是用了memcpy()代替std::memcpy(),而我没有, using namespace std;那么调用了哪个函数?是memcpy()与 不同的实现吗std::memcpy()?
我编写了一段代码,可以从 C++ 中的字符串中删除所有元音,但由于某种原因,它不会删除'o'一个特定输入的元音:zjuotps。
这是代码:
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;
cin >> s;
string a = "aeiouyAEIOUY";
for (int i = 0; i < s.length(); i++){
for(int j = 0; j < a.length(); j++){
if(s[i] == a[j]){
s.erase(s.begin() + i);
}
}
}
cout << s;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我输入:zjuotps
我得到的输出是:zjotps
我以前从未见过这个函数的调用char()。这是在哪里描述的,它是什么意思?此用法是此 cppreference.com 社区 wiki 页面上示例的一部分:https://en.cppreference.com/w/cpp/string/basic_string/resize:
short_string.resize( desired_length + 3 );
std::cout << "6. After: \"";
for (char c : short_string) {
std::cout << (c == char() ? '@' : c); // <=== HERE ===
}
Run Code Online (Sandbox Code Playgroud)
描述中的措辞对我来说也没有任何意义,我不明白它在说什么:
将附加字符初始化为
CharT().
在上下文中突出显示:
std::string::resize()方法的原因是尝试学习如何预先分配 astd::string以便在 C 函数调用中用作缓冲区char*。这可以通过首先std::string调用my_string.resize()函数来预分配 来实现。然后,您可以安全地&my_string[0]作为标准char*写入索引my_string.size() - 1。也可以看看:
不是What is std::invoke in c++?的重复项 。该问题专门询问了这一唯一的功能。这个问题询问一个概念,无需该功能即可 100% 解决,并且有多种替代解决方案,其中只有一些甚至使用该功能。
在 Python 中,您可以将函数名称和参数列表传递给外部函数,该外部函数调用内部函数并将这些参数传递给它,如下所示:
def perform(fun, *args):
fun(*args)
def action1(args):
# something
def action2(args):
# something
perform(action1)
perform(action2, p)
perform(action3, p, r)
Run Code Online (Sandbox Code Playgroud)
我如何在 C++ 中做到这一点?
AFAIK,退出代码可能会根据应用程序和项目中采用的约定而有所不同。但是,我想知道是否有 C/C++ 项目的退出代码标准列表。