Bjarne Stroustrup在他的书"The C++ Programming Language"第2章第23页(pdf第34页)的第3版(在线)中,在一个片段范例中定义了该函数sqrt.为什么他不只是使用已经包含在标准库中的那个?
我们可以使用std::unique_ptr将与分配的指针malloc将被free适当天.
但是,结果std::unique_ptr的大小将是2个指针,一个用于指向对象的指针,一个用于指向删除函数的指针,而不是通常的指向对象的指针和隐式指针delete.正如一个答案所指出的那样,可以通过编写Unique_ptr知道正确删除函数的自定义来避免这种情况.可以使用模板参数使该函数知道,以支持任何删除函数,如下所示:
template <class T, void (*Deleter)(T *)>
struct Unique_ptr {
explicit Unique_ptr(T *t, void (*)(T *))
: t{t} {}
~Unique_ptr() {
Deleter(t);
}
//TODO: add code to make it behave like std::unique_ptr
private:
T *t{};
};
template <class T>
void free(T *t) {
std::free(t);
}
char *some_C_function() {
return (char *)malloc(42);
}
int main() {
Unique_ptr<char, free> p(some_C_function(), free); //fine
Unique_ptr q(some_C_function(), free); //should be fine
//with …Run Code Online (Sandbox Code Playgroud) 当我定义一个递归函数时,在堆上分配局部变量,然后在函数返回之前清除它们比在堆栈上分配它们更好/更安全.嵌入式系统上的堆栈大小非常有限,当递归运行得太深时,存在堆栈溢出的危险.
给出以下代码:
#include <iostream>
#include <type_traits>
int main() {
std::aligned_storage<sizeof(double), alignof(double)> storage;
std::aligned_union<sizeof(double), double> union_storage;
std::cout << sizeof(storage) << '\n';
std::cout << sizeof(union_storage) << '\n';
std::cout << sizeof(double) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
我期望sizeof(storage)并且sizeof(union_storage)要大于或等于,sizeof(double)因为他们必须能够拥有一个double.但是,我得到了输出
1
1
8
Run Code Online (Sandbox Code Playgroud)
clang-3.8和gcc-5.3都产生这个输出.
为什么sizeof返回不正确的尺寸?
如果我使用放置新把一个double进入storage或union_storage将是未定义的行为吗?
我正在玩弄着解迭代器失效规则.但是,当我在c ++ 14编译器中运行以下代码时,输出真的让我很困惑..
std::vector<int> test = {1,2,3};
auto it = test.begin() + 1;
test.erase(it);
std::cout << *it << std::endl;
Run Code Online (Sandbox Code Playgroud)
输出= 3不应该在此时无效吗?为什么它似乎跳到下一个pos?提前谢谢了