C++ Primer, Fifth Edition
(f) IntP p5(p2.get());
Exercise 12.18: Why doesn’t shared_ptr have a release member?
12.1.6. weak_ptr
A weak_ptr (Table 12.5) is a smart pointer that does not control the lifetime of the
object to which it points. Instead, a weak_ptr points to an object that is managed by
a shared_ptr. Binding a weak_ptr to a shared_ptr does not change the
reference count of that shared_ptr. Once the last shared_ptr pointing to the
object goes away, the object itself will be deleted. That object will be deleted even if
there are weak_ptrs pointing to it—hence the name weak_ptr, which captures the
idea that a weak_ptr shares its object “weakly.”
Table 12.5. weak_ptrs
When we create a weak_ptr, we initialize it from a shared_ptr:
Click here to view code image
auto p = make_shared<int>(42);
weak_ptr<int> wp(p);  // wp weakly shares with p; use count in p is
unchanged
Here both wp and p point to the same object. Because the sharing is weak, creating
wp doesn’t change the reference count of p; it is possible that the object to which wp
points might be deleted.
Because the object might no longer exist, we cannot use a weak_ptr to access its
object directly. To access that object, we must call lock. The lock function checks
whether the object to which the weak_ptr points still exists. If so, lock returns a
shared_ptr to the shared object. As with any other shared_ptr, we are
www.it-ebooks.info
Change pdf to powerpoint on - C# Create PDF from PowerPoint Library to convert pptx, ppt to PDF in C#.net, ASP.NET MVC, WinForms, WPF
Online C# Tutorial for Creating PDF from Microsoft PowerPoint Presentation
convert pdf to ppt online; how to convert pdf to powerpoint on
Change pdf to powerpoint on - VB.NET Create PDF from PowerPoint Library to convert pptx, ppt to PDF in vb.net, ASP.NET MVC, WinForms, WPF
VB.NET Tutorial for Export PDF file from Microsoft Office PowerPoint
convert pdf to powerpoint slide; convert pdf to powerpoint using
C++ Primer, Fifth Edition
guaranteed that the underlying object to which that shared_ptr points continues to
exist at least as long as that shared_ptr exists. For example:
Click here to view code image
if (shared_ptr<int> np = wp.lock()) { // true if np is not null
// inside the if, np shares its object with p
}
Here we enter the body of the if only if the call to lock succeeds. Inside the if, it
is safe to use np to access that object.
Checked Pointer Class
As an illustration of when a weak_ptr is useful, we’ll define a companion pointer
class for our StrBlob class. Our pointer class, which we’ll name StrBlobPtr, will
store a weak_ptr to the data member of the StrBlob from which it was initialized.
By using a weak_ptr, we don’t affect the lifetime of the vector to which a given
StrBlob points. However, we can prevent the user from attempting to access a
vector that no longer exists.
StrBlobPtr will have two data members: wptr, which is either null or points to a
vector in a StrBlob; and curr, which is the index of the element that this object
currently denotes. Like its companion StrBlob class, our pointer class has a check
member to verify that it is safe to dereference the StrBlobPtr:
Click here to view code image
// StrBlobPtr throws an exception on attempts to access a nonexistent element
class StrBlobPtr {
public:
StrBlobPtr(): curr(0) { }
StrBlobPtr(StrBlob &a, size_t sz = 0):
wptr(a.data), curr(sz) { }
std::string& deref() const;
StrBlobPtr& incr();       // prefix version
private:
// check returns a shared_ptr to the vector if the check succeeds
std::shared_ptr<std::vector<std::string>>
check(std::size_t, const std::string&) const;
// store a weak_ptrwhich means the underlying vector might be destroyed
std::weak_ptr<std::vector<std::string>> wptr;
std::size_t curr;      // current position within the array
};
The default constructor generates a null StrBlobPtr. Its constructor initializer list
(§ 7.1.4, p. 265) explicitly initializes curr to zero and implicitly initializes wptr as a
null weak_ptr. The second constructor takes a reference to StrBlob and an
optional index value. This constructor initializes wptr to point to the vector in the
shared ptr of the given StrBlob object and initializes curr to the value of sz.
www.it-ebooks.info
Online Convert PowerPoint to PDF file. Best free online export
Online Powerpoint to PDF Converter. Download Free Trial. Then just wait until the conversion from Powerpoint to PDF is complete and download the file.
pdf to powerpoint slide; convert pdf to powerpoint online for
RasterEdge XDoc.PowerPoint for .NET - SDK for PowerPoint Document
Able to view and edit PowerPoint rapidly. Convert. Convert PowerPoint to PDF. Convert PowerPoint to HTML5. Convert PowerPoint to Tiff. Convert PowerPoint to Jpeg
converter pdf to powerpoint; pdf to powerpoint converter online
C++ Primer, Fifth Edition
We use a default argument (§ 6.5.1, p. 236) to initialize curr to denote the first
element by default. As we’ll see, the sz parameter will be used by the end member of
StrBlob.
It is worth noting that we cannot bind a StrBlobPtr to a const StrBlob
object. This restriction follows from the fact that the constructor takes a reference to
a nonconst object of type StrBlob.
The check member of StrBlobPtr differs from the one in StrBlob because it
must check whether the vector to which it points is still around:
Click here to view code image
std::shared_ptr<std::vector<std::string>>
StrBlobPtr::check(std::size_t i, const std::string &msg)
const
{
auto ret = wptr.lock();   // is the vector still around?
if (!ret)
throw std::runtime_error("unbound StrBlobPtr");
if (i >= ret->size())
throw std::out_of_range(msg);
return ret; // otherwise, return a shared_ptr to the vector
}
Because a weak_ptr does not participate in the reference count of its corresponding
shared_ptr, the vector to which this StrBlobPtr points might have been
deleted. If the vector is gone, lock will return a null pointer. In this case, any
reference to the vector will fail, so we throw an exception. Otherwise, check verifies
its given index. If that value is okay, check returns the shared_ptr it obtained from
lock.
Pointer Operations
We’ll learn how to define our own operators in Chapter 14. For now, we’ve defined
functions named deref and incr to dereference and increment the StrBlobPtr,
respectively.
The deref member calls check to verify that it is safe to use the vector and that
curr is in range:
Click here to view code image
std::string& StrBlobPtr::deref() const
{
auto p = check(curr, "dereference past end");
return (*p)[curr];  // (*p) is the vector to which this object points
}
If check succeeds, p is a shared_ptr to the vector to which this StrBlobPtr
points. The expression (*p)[curr] dereferences that shared_ptr to get the
www.it-ebooks.info
C# WinForms Viewer: Load, View, Convert, Annotate and Edit
to PDF; Convert PowerPoint to PDF; Convert Image to PDF; Convert Jpeg to PDF; Merge PDF Files; Split PDF Document; Remove Password from PDF; Change PDF Permission
export pdf into powerpoint; how to convert pdf to powerpoint in
How to C#: Overview of Using XDoc.PowerPoint
How to C#: Overview of Using XDoc.PowerPoint. Overview for How to Use XDoc.PowerPoint in C# .NET Programming Project. PowerPoint Conversion.
pdf picture to powerpoint; how to change pdf to powerpoint slides
C++ Primer, Fifth Edition
vector and uses the subscript operator to fetch and return the element at curr.
The incr member also calls check:
Click here to view code image
// prefix: return a reference to the incremented object
StrBlobPtr& StrBlobPtr::incr()
{
// if curr already points past the end of the container, can't increment it
check(curr, "increment past end of StrBlobPtr");
++curr;       // advance the current state
return *this;
}
Of course, in order to access the data member, our pointer class will have to be a
friend of StrBlob (§ 7.3.4, p. 279). We’ll also give our StrBlob class begin and
end operations that return a StrBlobPtr pointing to itself:
Click here to view code image
// forward declaration needed for friend declaration in StrBlob
class StrBlobPtr;
class StrBlob {
friend class StrBlobPtr;
// other members as in § 12.1.1 (p. 456)
// return StrBlobPtr to the first and one past the last elements
StrBlobPtr begin() { return StrBlobPtr(*this); }
StrBlobPtr end()
{ auto ret = StrBlobPtr(*this, data->size());
return ret; }
};
Exercises Section 12.1.6
Exercise 12.19: Define your own version of StrBlobPtr and update your
StrBlob class with the appropriate friend declaration and begin and end
members.
Exercise 12.20: Write a program that reads an input file a line at a time
into a StrBlob and uses a StrBlobPtr to print each element in that
StrBlob.
Exercise 12.21: We could have written StrBlobPtr’s deref member as
follows:
Click here to view code image
std::string& deref() const
{ return (*check(curr, "dereference past end"))[curr]; }
Which version do you think is better and why?
www.it-ebooks.info
C# HTML5 Viewer: Load, View, Convert, Annotate and Edit PowerPoint
Such as load and view PowerPoint without Microsoft Office software installed, convert PowerPoint to PDF file, Tiff image and HTML file, as well as add
drag and drop pdf into powerpoint; how to convert pdf slides to powerpoint
VB.NET PowerPoint: Read, Edit and Process PPTX File
create image on desired PowerPoint slide, merge/split PowerPoint file, change the order of How to convert PowerPoint to PDF, render PowerPoint to SVG
add pdf to powerpoint; how to change pdf to powerpoint
C++ Primer, Fifth Edition
Exercise 12.22: What changes would need to be made to StrBlobPtr to
create a class that can be used with a const StrBlob? Define a class
named ConstStrBlobPtr that can point to a const StrBlob.
12.2. Dynamic Arrays
The new and delete operators allocate objects one at a time. Some applications,
need the ability to allocate storage for many objects at once. For example, vectors
and strings store their elements in contiguous memory and must allocate several
elements at once whenever the container has to be reallocated (§ 9.4, p. 355).
To support such usage, the language and library provide two ways to allocate an
array of objects at once. The language defines a second kind of new expression that
allocates and initializes an array of objects. The library includes a template class
named allocator that lets us separate allocation from initialization. For reasons we’ll
explain in § 12.2.2 (p. 481), using an allocator generally provides better
performance and more flexible memory management.
Many, perhaps even most, applications have no direct need for dynamic arrays.
When an application needs a varying number of objects, it is almost always easier,
faster, and safer to do as we did with StrBlob: use a vector (or other library
container). For reasons we’ll explain in § 13.6 (p. 531), the advantages of using a
library container are even more pronounced under the new standard. Libraries that
support the new standard tend to be dramatically faster than previous releases.
Best Practices
Most applications should use a library container rather than dynamically
allocated arrays. Using a container is easier, less likely to contain memory-
management bugs, 
and
is likely to give better performance.
As we’ve seen, classes that use the containers can use the default versions of the
operations for copy, assignment, and destruction (§ 7.1.5, p. 267). Classes that
allocate dynamic arrays must define their own versions of these operations to manage
the associated memory when objects are copied, assigned, and destroyed.
Warning
Do not allocate dynamic arrays in code inside classes until you have read
Chapter 13.
www.it-ebooks.info
VB.NET PDF Password Library: add, remove, edit PDF file password
Add password to PDF. Change PDF original password. Remove password from PDF. Set PDF security level. VB: Change and Update PDF Document Password.
converting pdf to powerpoint slides; converting pdf to powerpoint online
C# powerpoint - Convert PowerPoint to PDF in C#.NET
C# PowerPoint - Convert PowerPoint to PDF in C#.NET. Online C# Tutorial for Converting PowerPoint to PDF (.pdf) Document. PowerPoint to PDF Conversion Overview.
and paste pdf to powerpoint; how to convert pdf to ppt for
C++ Primer, Fifth Edition
12.2.1. new and Arrays
We ask new to allocate an array of objects by specifying the number of objects to
allocate in a pair of square brackets after a type name. In this case, new allocates the
requested number of objects and (assuming the allocation succeeds) returns a pointer
to the first one:
Click here to view code image
// call get_size to determine how many ints to allocate
int *pia = new int[get_size()]; // pia points to the first of these ints
The size inside the brackets must have integral type but need not be a constant.
We can also allocate an array by using a type alias (§ 2.5.1, p. 67) to represent an
array type. In this case, we omit the brackets:
Click here to view code image
typedef int arrT[42]; // arrT names the type array of 42 ints
int *p = new arrT;    // allocates an array of 42 ints; p points to the first
one
Here, new allocates an array of ints and returns a pointer to the first one. Even
though there are no brackets in our code, the compiler executes this expression using
new[]. That is, the compiler executes this expression as if we had written
int *p = new int[42];
Allocating an Array Yields a Pointer to the Element Type
Although it is common to refer to memory allocated by new T[] as a “dynamic
array,” this usage is somewhat misleading. When we use new to allocate an array, we
do not get an object with an array type. Instead, we get a pointer to the element type
of the array. Even if we use a type alias to define an array type, new does not
allocate an object of array type. In this case, the fact that we’re allocating an array is
not even visible; there is no [
num
]. Even so, new returns a pointer to the element
type.
Because the allocated memory does not have an array type, we cannot call begin
or end (§ 3.5.3, p. 118) on a dynamic array. These functions use the array dimension
(which is part of an array’s type) to return pointers to the first and one past the last
elements, respectively. For the same reasons, we also cannot use a range for to
process the elements in a (so-called) dynamic array.
www.it-ebooks.info
C++ Primer, Fifth Edition
Warning
It is important to remember that what we call a dynamic array does not have
an array type.
Initializing an Array of Dynamically Allocated Objects
By default, objects allocated by new—whether allocated as a single object or in an
array—are default initialized. We can value initialize (§ 3.3.1, p. 98) the elements in
an array by following the size with an empty pair of parentheses.
Click here to view code image
int *pia = new int[10];          // block of ten uninitialized ints
int *pia2 = new int[10]();       // block of ten ints value initialized to
0
string *psa = new string[10];    // block of ten empty strings
string *psa2 = new string[10](); // block of ten empty strings
Under the new standard, we can also provide a braced list of element initializers:
Click here to view code image
// block of ten ints each initialized from the corresponding initializer
int *pia3 = new int[10]{0,1,2,3,4,5,6,7,8,9};
// block of ten strings; the first four are initialized from the given initializers
// remaining elements are value initialized
string 
*psa3 
new 
string[10]{"a", 
"an", 
"the",
string(3,'x')};
As when we list initialize an object of built-in array type (§ 3.5.1, p. 114), the
initializers are used to initialize the first elements in the array. If there are fewer
initializers than elements, the remaining elements are value initialized. If there are
more initializers than the given size, then the new expression fails and no storage is
allocated. In this case, new throws an exception of type bad_array_new_length.
Like bad_alloc, this type is defined in the new header.
Although we can use empty parentheses to value initialize the elements of an array,
we cannot supply an element initializer inside the parentheses. The fact that we
cannot supply an initial value inside the parentheses means that we cannot use auto
to allocate an array (§ 12.1.2, p. 459).
It Is Legal to Dynamically Allocate an Empty Array
www.it-ebooks.info
C++ Primer, Fifth Edition
We can use an arbitrary expression to determine the number of objects to allocate:
Click here to view code image
size_t n = get_size(); // get_size returns the number of elements needed
int* p = new int[n];   // allocate an array to hold the elements
for (int* q = p; q != p + n; ++q)
/* process the array */ ;
An interesting question arises: What happens if get_size returns 0? The answer is
that our code works fine. Calling new[n] with n equal to 0 is legal even though we
cannot create an array variable of size 0:
Click here to view code image
char arr[0];            // error: cannot define a zero-length array
char *cp = new char[0]; // ok: but cp can't be dereferenced
When we use new to allocate an array of size zero, new returns a valid, nonzero
pointer. That pointer is guaranteed to be distinct from any other pointer returned by
new. This pointer acts as the off-the-end pointer (§ 3.5.3, p. 119) for a zero-element
array. We can use this pointer in ways that we use an off-the-end iterator. The
pointer can be compared as in the loop above. We can add zero to (or subtract zero
from) such a pointer and can subtract the pointer from itself, yielding zero. The
pointer cannot be dereferenced—after all, it points to no element.
In our hypothetical loop, if get_size returns 0, then n is also 0. The call to new
will allocate zero objects. The condition in the for will fail (p is equal to q + n
because n is 0). Thus, the loop body is not executed.
Freeing Dynamic Arrays
To free a dynamic array, we use a special form of delete that includes an empty pair
of square brackets:
Click here to view code image
delete p;     // p must point to a dynamically allocated object or be null
delete [] pa; // pa must point to a dynamically allocated array or be null
The second statement destroys the elements in the array to which pa points and frees
the corresponding memory. Elements in an array are destroyed in reverse order. That
is, the last element is destroyed first, then the second to last, and so on.
When we delete a pointer to an array, the empty bracket pair is essential: It
indicates to the compiler that the pointer addresses the first element of an array of
objects. If we omit the brackets when we delete a pointer to an array (or provide
them when we delete a pointer to an object), the behavior is undefined.
Recall that when we use a type alias that defines an array type, we can allocate an
www.it-ebooks.info
C++ Primer, Fifth Edition
array without using [] with new. Even so, we must use brackets when we delete a
pointer to that array:
Click here to view code image
typedef int arrT[42];  // arrT names the type array of 42 ints
int *p = new arrT;     // allocates an array of 42 ints; p points to the first
one
delete [] p;           // brackets are necessary because we allocated an
array
Despite appearances, p points to the first element of an array of objects, not to a
single object of type arrT. Thus, we must use [] when we delete p.
Warning
The compiler is unlikely to warn us if we forget the brackets when we
delete a pointer to an array or if we use them when we delete a pointer
to an object. Instead, our program is apt to misbehave without warning
during execution.
Smart Pointers and Dynamic Arrays
The library provides a version of unique_ptr that can manage arrays allocated by
new. To use a unique_ptr to manage a dynamic array, we must include a pair of
empty brackets after the object type:
Click here to view code image
// up points to an array of ten uninitialized ints
unique_ptr<int[]> up(new int[10]);
up.release();   // automatically uses delete[] to destroy its pointer
The brackets in the type specifier (<int[]>) say that up points not to an int but to
an array of ints. Because up points to an array, when up destroys the pointer it
manages, it will automatically use delete[].
unqiue_ptrs that point to arrays provide slightly different operations than those
we used in § 12.1.5 (p. 470). These operations are described in Table 12.6 (overleaf).
When a unique_ptr points to an array, we cannot use the dot and arrow member
access operators. After all, the unqiue_ptr points to an array, not an object so these
operators would be meaningless. On the other hand, when a unqiue_ptr points to
an array, we can use the subscript operator to access the elements in the array:
Click here to view code image
for (size_t i = 0; i != 10; ++i)
www.it-ebooks.info
C++ Primer, Fifth Edition
up[i] = i; // assign a new value to each of the elements
Table 12.6. unique_ptrs to Arrays
Unlike unique_ptr, shared_ptrs provide no direct support for managing a
dynamic array. If we want to use a shared_ptr to manage a dynamic array, we
must provide our own deleter:
Click here to view code image
// to use a shared_ptr we must supply a deleter
shared_ptr<int> sp(new int[10], [](int *p) { delete[] p; });
sp.reset(); // uses the lambda we supplied that uses delete[] to free the array
Here we pass a lambda (§ 10.3.2, p. 388) that uses delete[] as the deleter.
Had we neglected to supply a deleter, this code would be undefined. By default,
shared_ptr uses delete to destroy the object to which it points. If that object is a
dynamic array, using delete has the same kinds of problems that arise if we forget
to use [] when we delete a pointer to a dynamic array (§ 12.2.1, p. 479).
The fact that shared_ptr does not directly support managing arrays affects how we
access the elements in the array:
Click here to view code image
// shared_ptrs don't have subscript operator and don't support pointer arithmetic
for (size_t i = 0; i != 10; ++i)
*(sp.get() + i) = i;  // use get to get a built-in pointer
There is no subscript operator for shared_ptrs, and the smart pointer types do not
support pointer arithmetic. As a result, to access the elements in the array, we must
use get to obtain a built-in pointer, which we can then use in normal ways.
Exercises Section 12.2.1
Exercise 12.23: Write a program to concatenate two string literals, putting
the result in a dynamically allocated array of char. Write a program to
concatenate two library strings that have the same value as the literals
used in the first program.
Exercise 12.24: Write a program that reads a string from the standard input
www.it-ebooks.info
Documents you may be interested
Documents you may be interested