假设有一个包含int向量的A类.现在假设创建了A的向量.如果由于push_back而发生A对象的重新分配(因此移动了矢量对象),那么指向int的指针是否仍然有效?这有保证吗?
澄清:
class A {
public:
A() {};
std::vector<int> a = {1,2,3,4,5,6,7,8,9};
};
int main()
{
std::vector<A> aVec(2);
int *x1 = &(aVec[1].a[2]);
A *x2 = &aVec[1];
std::cout << x1 << " - " << x2 << " - " << aVec.capacity() << "\n";
aVec.resize(30);
int *y1 = &(aVec[1].a[2]);
A *y2 = &aVec[1];
std::cout << y1 << " - " << y2 << " - " << aVec.capacity() << "\n";
}
Run Code Online (Sandbox Code Playgroud)
运行此代码可以得到:
0x1810088 - 0x1810028 - 2
0x1810088 - 0x18100c8 - …Run Code Online (Sandbox Code Playgroud) 我目前有一个带有自定义makefile的C++项目.我告诉eclipse简单地调用make,makefile处理所有内容.该项目构建良好,但eclipse一直强调广义lambda捕获为"语法错误".据我了解:
这是CDT索引器不了解C++ 14语法的问题.
我试过这里的答案:
但他们没有处理我的案例,即Eclipse Luna +自定义makefile项目+ c ++ 14.
这个问题可能与我的有关,但它没有答案[我也没有能力改变索引器]:
有关如何让索引器识别c ++ 14功能的任何想法?
由于某些原因,PS C++ 11功能未突出显示为语法错误.我还应该注意到我在makefile中使用了clang 3.4.2; 显然,它支持c ++ 14.虽然可用的g ++版本是4.4.7,但它不支持c ++ 14.这可能是某种程度上的问题吗?CDT使用系统的g ++作为索引器吗?如果是这样,我如何在不更新g ++的情况下进行更改(我正在使用有限的用户权限并更新它会很麻烦)?
我目前正在阅读本教程/ rvalue参考的解释:
http://thbecker.net/articles/rvalue_references/section_07.html
在第二段到最后一段中,作者提到" 工厂主体中T的复制构造函数的论证是一个左值 ".他所指的代码是这样的:
template<typename T, typename Arg>
shared_ptr<T> factory(Arg const & arg)
{
return shared_ptr<T>(new T(arg));
}
Run Code Online (Sandbox Code Playgroud)
我意识到new T(arg)在堆上构造一个T对象,但是返回的值不是一个临时指针值,如果不使用它会丢失(导致内存泄漏),因此是一个rvalue?
编辑:只是为了澄清,我知道在这个例子中将没有内存泄漏.我的意思是,如果指针值没有被使用,我们将无法访问构造的T对象,因此我们会得到内存泄漏.
c++ ×3
c++14 ×1
eclipse ×1
eclipse-cdt ×1
lvalue ×1
makefile ×1
new-operator ×1
rvalue ×1
stl ×1
vector ×1