220 19160 <CALDL7dH8xOOY-Jk1L0tv4Uns8Szxi9vY-tDiCDgiXVaDzswoUw@mail.gmail.com> article
Path: news.gmane.org!not-for-mail
From: Farid Mehrabi <farid.mehrabi@gmail.com>
Newsgroups: gmane.comp.lang.c++.isocpp.proposals
Subject: Re: New type of "new"/"delete" override
Date: Wed, 22 Jul 2015 20:26:35 +0430
Lines: 481
Approved: news@gmane.org
Message-ID: <CALDL7dH8xOOY-Jk1L0tv4Uns8Szxi9vY-tDiCDgiXVaDzswoUw@mail.gmail.com>
References: <2328a5fd-924c-4d02-ac18-6a225f786dec@isocpp.org>
Reply-To: std-proposals@isocpp.org
NNTP-Posting-Host: plane.gmane.org
Mime-Version: 1.0
Content-Type: multipart/alternative; boundary=001a114938b4189814051b78d32c
X-Trace: ger.gmane.org 1437580639 12265 80.91.229.3 (22 Jul 2015 15:57:19 GMT)
X-Complaints-To: usenet@ger.gmane.org
NNTP-Posting-Date: Wed, 22 Jul 2015 15:57:19 +0000 (UTC)
To: std-proposals <std-proposals@isocpp.org>
Original-X-From: std-proposals+bncBC27JR6ERAOBBW72X2WQKGQEI3UDQSI@isocpp.org Wed Jul 22 17:57:18 2015
Return-path: <std-proposals+bncBC27JR6ERAOBBW72X2WQKGQEI3UDQSI@isocpp.org>
Envelope-to: gclcip-std-proposals@m.gmane.org
Original-Received: from mail-qg0-f69.google.com ([209.85.192.69])
	by plane.gmane.org with esmtp (Exim 4.69)
	(envelope-from <std-proposals+bncBC27JR6ERAOBBW72X2WQKGQEI3UDQSI@isocpp.org>)
	id 1ZHwOT-0007yJ-F4
	for gclcip-std-proposals@m.gmane.org; Wed, 22 Jul 2015 17:57:17 +0200
Original-Received: by qges31 with SMTP id s31sf233190151qge.3
        for <gclcip-std-proposals@m.gmane.org>; Wed, 22 Jul 2015 08:57:16 -0700 (PDT)
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20130820;
        h=x-gm-message-state:mime-version:in-reply-to:references:from:date
         :message-id:subject:to:content-type:x-original-sender
         :x-original-authentication-results:reply-to:precedence:mailing-list
         :list-id:x-spam-checked-in-group:list-post:list-help:list-archive
         :list-subscribe:list-unsubscribe;
        bh=Gigf1U7zz/FOxI6EcBzvdvS6hTEewacBdezHz6sx9Ik=;
        b=SPCOewlW88X5cnVrQZbyTk4Zb3CLnotkEgfBB+tYquV7bqzg6Lg+ZYDe5UjecS7XTa
         RmKNi6TYbaWddRRhiXirWIsUQPDGBruU7zjyUbXXxW77WlhEks8jQQmIvKenGGXeN7/F
         lBZ5ssU/VSNwm3nwqkVEWTLegiP6JCRwRK6evQd65wiS/3sBS3P/7UNCnDu3mKApg4ZQ
         rwtGzIFgD1ALAt41JBpZctGTVWjgeXPqTYmKC0wGZGPEzCXn9laKq8w1G+z5efO+VFUz
         BPqwUr1mTWGK1pgDjerYiqlIJLWzz/vAmhV4cxUItbmbRGkGMYxQHwYlVWnHwTe3/nWZ
         dFOw==
X-Gm-Message-State: ALoCoQkJyO/LqaWldSbXZhi3Wv+Hm0/1GmWIw9CvAdu4N4xAIpKUwOc+yvwuPDQrAgSCPjdaZnMC
X-Received: by 10.129.117.70 with SMTP id q67mr3427524ywc.57.1437580636512;
        Wed, 22 Jul 2015 08:57:16 -0700 (PDT)
X-BeenThere: std-proposals@isocpp.org
Original-Received: by 10.140.30.200 with SMTP id d66ls457483qgd.63.gmail; Wed, 22 Jul
 2015 08:57:15 -0700 (PDT)
X-Received: by 10.140.20.115 with SMTP id 106mr4706168qgi.87.1437580635461;
        Wed, 22 Jul 2015 08:57:15 -0700 (PDT)
Original-Received: from mail-qg0-x22d.google.com (mail-qg0-x22d.google.com. [2607:f8b0:400d:c04::22d])
        by mx.google.com with ESMTPS id s32si2144771qge.75.2015.07.22.08.57.15
        for <std-proposals@isocpp.org>
        (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
        Wed, 22 Jul 2015 08:57:15 -0700 (PDT)
Received-SPF: pass (google.com: domain of farid.mehrabi@gmail.com designates 2607:f8b0:400d:c04::22d as permitted sender) client-ip=2607:f8b0:400d:c04::22d;
Original-Received: by qgii95 with SMTP id i95so73652737qgi.2
        for <std-proposals@isocpp.org>; Wed, 22 Jul 2015 08:57:15 -0700 (PDT)
X-Received: by 10.55.43.224 with SMTP id r93mr4767804qkr.24.1437580635169;
 Wed, 22 Jul 2015 08:57:15 -0700 (PDT)
Original-Received: by 10.96.216.42 with HTTP; Wed, 22 Jul 2015 08:56:35 -0700 (PDT)
In-Reply-To: <2328a5fd-924c-4d02-ac18-6a225f786dec@isocpp.org>
X-Original-Sender: farid.mehrabi@gmail.com
X-Original-Authentication-Results: mx.google.com;       spf=pass (google.com:
 domain of farid.mehrabi@gmail.com designates 2607:f8b0:400d:c04::22d as
 permitted sender) smtp.mail=farid.mehrabi@gmail.com;       dkim=pass
 header.i=@gmail.com;       dmarc=pass (p=NONE dis=NONE) header.from=gmail.com
Precedence: list
Mailing-list: list std-proposals@isocpp.org; contact std-proposals+owners@isocpp.org
List-ID: <std-proposals.isocpp.org>
X-Spam-Checked-In-Group: std-proposals@isocpp.org
X-Google-Group-Id: 399137483710
List-Post: <http://groups.google.com/a/isocpp.org/group/std-proposals/post>, <mailto:std-proposals@isocpp.org>
List-Help: <http://support.google.com/a/isocpp.org/bin/topic.py?topic=25838>, <mailto:std-proposals+help@isocpp.org>
List-Archive: <http://groups.google.com/a/isocpp.org/group/std-proposals/>
List-Subscribe: <http://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>,
 <mailto:std-proposals+subscribe@isocpp.org>
List-Unsubscribe: <mailto:googlegroups-manage+399137483710+unsubscribe@googlegroups.com>,
 <http://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>
Xref: news.gmane.org gmane.comp.lang.c++.isocpp.proposals:19160
Archived-At: <http://permalink.gmane.org/gmane.comp.lang.c++.isocpp.proposals/19160>

--001a114938b4189814051b78d32c
Content-Type: text/plain; charset=UTF-8

none-public members can only be accesses via either a member or a subclass
or a friend, so if you need to access those functions in any generic
class/function you can just make the appropriate instance a friend. One
good implementation can be a generic class/function forwarding to a member
of its operand; thus allowing library user to control implementation
throughout sub-typing(similar to new/delete):

template<typename T> my_ptr
{
      template<typename ...Args> my_ptr   (Args&...a):
              ptr{new(T::my_new()T{a...})}
      {
             ...//blah blah blah
      };

     ~my_ptr()
     {
             ...//blah blah blah
            ptr->my_delete();
            ptr->~T();
     };

     my_raw_ptr<T> ptr;
     ...//blah blah blah
};

No need for any new core lang feature.

regards,
FM.

2015-07-22 0:07 GMT+04:30 Myriachan <myriachan@gmail.com>:

> In trying to implement a custom memory allocator, there are many
> annoyances that come up that make C++ difficult to work with.
> Particularly, the syntax of the new and delete operators means that using
> a custom memory allocator often involves macros that are semantically
> different from new and delete.  When private and protected constructors
> and destructors get involved, things get especially annoying, because the
> allocator code can't call the constructor or destructor itself.
>
> I thought of an idea that would help with this issue, though it is
> admittedly rather crazy.
>
> I would add a new type of operator new overload:
>
> template <typename Type, typename Constructor>
> Type *operator new valloc_new(const Constructor &constructor)
>     noexcept(noexcept(constructor(static_cast<Type *>(nullptr))))
> {
>     static_assert(alignof(Type) <= PAGE_SIZE, "only allocations of
> alignment PAGE_SIZE or less are supported") ;
>
>     std::size_t headerSize = 0;
>
>     // Custom implementations aren't required to use new_handlers
>     void *memory = VirtualAlloc(nullptr, headerSize + sizeof(Type),
> MEM_COMMIT, PAGE_READWRITE);
>     if (!memory)
>     {
>         throw std::bad_alloc("out of memory");
>     }
>
>     try
>     {
>         return constructor(memory);
>     }
>     catch (...)
>     {
>         VirtualFree(memory, 0, MEM_RELEASE);
>         throw;
>     }
> }
>
> template <typename Type, typename Destructor>
> void operator delete valloc_delete(Type *object, const Destructor &
> destructor)
> {
>     if (object == nullptr)
>     {
>         return;
>     }
>
>     // Get the base address of the most-derived object
>     void *memory = const_cast<std::remove_cv_t<Type> *>(object);
>     if (std::is_polymorphic<Type>::value)
>     {
>         memory = dynamic_cast<void *>(const_cast<std::remove_cv_t<Type>
> *>(object));
>     }
>
>     destructor(object);
>
>     VirtualFree(memory, 0, MEM_RELEASE);
> }
>
>
>
> Now valloc_new and valloc_delete in the proper scope will syntactically
> function the same way as the new and delete keywords, in a way becoming
> keywords themselves.  I think that it would be worthwhile to allow these to
> be scoped to namespaces or classes.
>
> The private constructor/destructor problem is solved, because they are
> passed in as lambdas (or function pointers, at implementation discretion).
>
> We can redefine the basic implementation of the "new" keyword to be an
> implementation-defined template function that calls ::operator new(size_t)
> and does other things, like dynamic_cast<void *> if the type is
> polymorphic.  Overriding the global new would work by replacing this
> template or its overloads.
>
> template <typename Type, typename Constructor, typename... Args>
> Type *operator new new(const Constructor &constructor, Args &&...args)
>     noexcept(
>         noexcept(constructor(static_cast<Type *>(nullptr))) &&
>         noexcept(::operator new(std::size_t(), std::forward<Args>(args
> )...)));
>
>
> Melissa
>
> --
>
> ---
> You received this message because you are subscribed to the Google Groups
> "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to std-proposals+unsubscribe@isocpp.org.
> To post to this group, send email to std-proposals@isocpp.org.
> Visit this group at
> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>



-- 
how am I supposed to end the twisted road of  your hair in such a dark
night??
unless the candle of your face does shed some light upon my way!!!

-- 

--- 
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.

--001a114938b4189814051b78d32c
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"rtl"><div class=3D"gmail_default" style=3D"text-align:left;font=
-family:&#39;arial narrow&#39;,sans-serif;font-size:large" dir=3D"ltr">none=
-public members can only be accesses via either a member or a subclass or a=
 friend, so if you need to access those functions in any generic class/func=
tion you can just make the appropriate instance a friend. One good implemen=
tation can be a generic class/function forwarding to a member of its operan=
d; thus allowing library user to control implementation throughout sub-typi=
ng(similar to new/delete):</div><div class=3D"gmail_default" style=3D"text-=
align:left;font-family:&#39;arial narrow&#39;,sans-serif;font-size:large" d=
ir=3D"ltr"><br></div><div class=3D"gmail_default" style=3D"text-align:left;=
font-family:&#39;arial narrow&#39;,sans-serif;font-size:large" dir=3D"ltr">=
template&lt;typename T&gt; my_ptr</div><div class=3D"gmail_default" style=
=3D"text-align:left;font-family:&#39;arial narrow&#39;,sans-serif;font-size=
:large" dir=3D"ltr">{</div><div class=3D"gmail_default" style=3D"text-align=
:left;font-family:&#39;arial narrow&#39;,sans-serif;font-size:large" dir=3D=
"ltr">=C2=A0 =C2=A0 =C2=A0 template&lt;typename ...Args&gt; my_ptr =C2=A0 (=
Args&amp;...a):</div><div class=3D"gmail_default" style=3D"text-align:left;=
font-family:&#39;arial narrow&#39;,sans-serif;font-size:large" dir=3D"ltr">=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ptr{new(T::my_new()T{a...}=
)}</div><div class=3D"gmail_default" style=3D"text-align:left;font-family:&=
#39;arial narrow&#39;,sans-serif;font-size:large" dir=3D"ltr">=C2=A0 =C2=A0=
 =C2=A0 {</div><div class=3D"gmail_default" style=3D"text-align:left;font-f=
amily:&#39;arial narrow&#39;,sans-serif;font-size:large" dir=3D"ltr">=C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0...//blah blah blah</div><div cla=
ss=3D"gmail_default" style=3D"text-align:left;font-family:&#39;arial narrow=
&#39;,sans-serif;font-size:large" dir=3D"ltr">=C2=A0 =C2=A0 =C2=A0 };</div>=
<div class=3D"gmail_default" style=3D"text-align:left;font-family:&#39;aria=
l narrow&#39;,sans-serif;font-size:large" dir=3D"ltr">=C2=A0 =C2=A0 =C2=A0=
=C2=A0</div><div class=3D"gmail_default" style=3D"text-align:left;font-fami=
ly:&#39;arial narrow&#39;,sans-serif;font-size:large" dir=3D"ltr">=C2=A0 =
=C2=A0 =C2=A0~my_ptr()</div><div class=3D"gmail_default" style=3D"text-alig=
n:left;font-family:&#39;arial narrow&#39;,sans-serif;font-size:large" dir=
=3D"ltr">=C2=A0 =C2=A0 =C2=A0{</div><div class=3D"gmail_default" dir=3D"ltr=
" style=3D"font-family:&#39;arial narrow&#39;,sans-serif;font-size:large">=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0...//blah blah blah</div><d=
iv class=3D"gmail_default" style=3D"text-align:left;font-family:&#39;arial =
narrow&#39;,sans-serif;font-size:large" dir=3D"ltr">=C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 ptr-&gt;my_delete();<br></div><div class=3D"gmail_defa=
ult" style=3D"text-align:left;font-family:&#39;arial narrow&#39;,sans-serif=
;font-size:large" dir=3D"ltr">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ptr=
-&gt;~T();</div><div class=3D"gmail_default" style=3D"text-align:left;font-=
family:&#39;arial narrow&#39;,sans-serif;font-size:large" dir=3D"ltr">=C2=
=A0 =C2=A0 =C2=A0};</div><div class=3D"gmail_default" style=3D"text-align:l=
eft;font-family:&#39;arial narrow&#39;,sans-serif;font-size:large" dir=3D"l=
tr"><br></div><div class=3D"gmail_default" style=3D"text-align:left;font-fa=
mily:&#39;arial narrow&#39;,sans-serif;font-size:large" dir=3D"ltr">=C2=A0 =
=C2=A0 =C2=A0my_raw_ptr&lt;T&gt; ptr;</div><div class=3D"gmail_default" sty=
le=3D"text-align:left;font-family:&#39;arial narrow&#39;,sans-serif;font-si=
ze:large" dir=3D"ltr"><div class=3D"gmail_default" dir=3D"ltr">=C2=A0 =C2=
=A0 =C2=A0...//blah blah blah</div></div><div class=3D"gmail_default" style=
=3D"text-align:left;font-family:&#39;arial narrow&#39;,sans-serif;font-size=
:large" dir=3D"ltr">};</div><div class=3D"gmail_default" style=3D"text-alig=
n:left;font-family:&#39;arial narrow&#39;,sans-serif;font-size:large" dir=
=3D"ltr"><br></div><div class=3D"gmail_default" style=3D"text-align:left;fo=
nt-family:&#39;arial narrow&#39;,sans-serif;font-size:large" dir=3D"ltr">No=
 need for any new core lang feature.</div><div class=3D"gmail_default" styl=
e=3D"text-align:left;font-family:&#39;arial narrow&#39;,sans-serif;font-siz=
e:large" dir=3D"ltr"><br></div><div class=3D"gmail_default" style=3D"text-a=
lign:left;font-family:&#39;arial narrow&#39;,sans-serif;font-size:large" di=
r=3D"ltr">regards,</div><div class=3D"gmail_default" style=3D"text-align:le=
ft;font-family:&#39;arial narrow&#39;,sans-serif;font-size:large" dir=3D"lt=
r">FM.</div></div><div class=3D"gmail_extra"><br><div class=3D"gmail_quote"=
><div dir=3D"ltr">2015-07-22 0:07 GMT+04:30 Myriachan <span dir=3D"ltr">&lt=
;<a href=3D"mailto:myriachan@gmail.com" target=3D"_blank">myriachan@gmail.c=
om</a>&gt;</span>:</div><blockquote class=3D"gmail_quote" style=3D"margin:0=
 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">In =
trying to implement a custom memory allocator, there are many annoyances th=
at come up that make C++ difficult to work with.=C2=A0 Particularly, the sy=
ntax of the <span style=3D"font-family:courier new,monospace">new</span> an=
d <span style=3D"font-family:courier new,monospace">delete</span> operators=
 means that using a custom memory allocator often involves macros that are =
semantically different from <span style=3D"font-family:courier new,monospac=
e">new</span> and <span style=3D"font-family:courier new,monospace">delete<=
/span>.=C2=A0 When private and protected constructors and destructors get i=
nvolved, things get especially annoying, because the allocator code can&#39=
;t call the constructor or destructor itself.<br><br>I thought of an idea t=
hat would help with this issue, though it is admittedly rather crazy.<br><b=
r>I would add a new type of <span style=3D"font-family:courier new,monospac=
e">operator new</span> overload:<br><br><div style=3D"background-color:rgb(=
250,250,250);border-color:rgb(187,187,187);border-style:solid;border-width:=
1px;word-wrap:break-word"><code><div><span style=3D"color:#008">template</s=
pan><span style=3D"color:#000"> </span><span style=3D"color:#660">&lt;</spa=
n><span style=3D"color:#008">typename</span><span style=3D"color:#000"> </s=
pan><span style=3D"color:#606">Type</span><span style=3D"color:#660">,</spa=
n><span style=3D"color:#000"> </span><span style=3D"color:#008">typename</s=
pan><span style=3D"color:#000"> </span><span style=3D"color:#606">Construct=
or</span><span style=3D"color:#660">&gt;</span><span style=3D"color:#000"><=
br></span><span style=3D"color:#606">Type</span><span style=3D"color:#000">=
 </span><span style=3D"color:#660">*</span><span style=3D"color:#008">opera=
tor</span><span style=3D"color:#000"> </span><span style=3D"color:#008">new=
</span><span style=3D"color:#000"> valloc_new</span><span style=3D"color:#6=
60">(</span><span style=3D"color:#008">const</span><span style=3D"color:#00=
0"> </span><span style=3D"color:#606">Constructor</span><span style=3D"colo=
r:#000"> </span><span style=3D"color:#660">&amp;</span><span style=3D"color=
:#000">constructor</span><span style=3D"color:#660">)</span><span style=3D"=
color:#000"><br>=C2=A0 =C2=A0 noexcept</span><span style=3D"color:#660">(</=
span><span style=3D"color:#000">noexcept</span><span style=3D"color:#660">(=
</span><span style=3D"color:#000">constructor</span><span style=3D"color:#6=
60">(</span><span style=3D"color:#008">static_cast</span><span style=3D"col=
or:#660">&lt;</span><span style=3D"color:#606">Type</span><span style=3D"co=
lor:#000"> </span><span style=3D"color:#660">*&gt;(</span><span style=3D"co=
lor:#008">nullptr</span><span style=3D"color:#660">))))</span><span style=
=3D"color:#000"><br></span><span style=3D"color:#660">{</span><span style=
=3D"color:#000"><br>=C2=A0 =C2=A0 </span><span style=3D"color:#008">static_=
assert</span><span style=3D"color:#660">(</span><span style=3D"color:#008">=
alignof</span><span style=3D"color:#660">(</span><span style=3D"color:#606"=
>Type</span><span style=3D"color:#660">)</span><span style=3D"color:#000"> =
</span><span style=3D"color:#660">&lt;=3D</span><span style=3D"color:#000">=
 PAGE_SIZE</span><span style=3D"color:#660">,</span><span style=3D"color:#0=
00"> </span><span style=3D"color:#080">&quot;only allocations of alignment =
PAGE_SIZE or less are supported&quot;</span><span style=3D"color:#660">)</s=
pan><span style=3D"color:#000"> </span><span style=3D"color:#660">;</span><=
span style=3D"color:#000"><br><br>=C2=A0 =C2=A0 std</span><span style=3D"co=
lor:#660">::</span><span style=3D"color:#000">size_t headerSize </span><spa=
n style=3D"color:#660">=3D</span><span style=3D"color:#000"> </span><span s=
tyle=3D"color:#066">0</span><span style=3D"color:#660">;</span><span style=
=3D"color:#000"><br><br>=C2=A0 =C2=A0 </span><span style=3D"color:#800">// =
Custom implementations aren&#39;t required to use new_handlers</span><span =
style=3D"color:#000"><br>=C2=A0 =C2=A0 </span><span style=3D"color:#008">vo=
id</span><span style=3D"color:#000"> </span><span style=3D"color:#660">*</s=
pan><span style=3D"color:#000">memory </span><span style=3D"color:#660">=3D=
</span><span style=3D"color:#000"> </span><span style=3D"color:#606">Virtua=
lAlloc</span><span style=3D"color:#660">(</span><span style=3D"color:#008">=
nullptr</span><span style=3D"color:#660">,</span><span style=3D"color:#000"=
> headerSize </span><span style=3D"color:#660">+</span><span style=3D"color=
:#000"> </span><span style=3D"color:#008">sizeof</span><span style=3D"color=
:#660">(</span><span style=3D"color:#606">Type</span><span style=3D"color:#=
660">),</span><span style=3D"color:#000"> MEM_COMMIT</span><span style=3D"c=
olor:#660">,</span><span style=3D"color:#000"> PAGE_READWRITE</span><span s=
tyle=3D"color:#660">);</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 <=
/span><span style=3D"color:#008">if</span><span style=3D"color:#000"> </spa=
n><span style=3D"color:#660">(!</span><span style=3D"color:#000">memory</sp=
an><span style=3D"color:#660">)</span><span style=3D"color:#000"><br>=C2=A0=
 =C2=A0 </span><span style=3D"color:#660">{</span><span style=3D"color:#000=
"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#008">throw</=
span><span style=3D"color:#000"> std</span><span style=3D"color:#660">::</s=
pan><span style=3D"color:#000">bad_alloc</span><span style=3D"color:#660">(=
</span><span style=3D"color:#080">&quot;out of memory&quot;</span><span sty=
le=3D"color:#660">);</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 </s=
pan><span style=3D"color:#660">}</span><span style=3D"color:#000"><br><br>=
=C2=A0 =C2=A0 </span><span style=3D"color:#008">try</span><span style=3D"co=
lor:#000"><br>=C2=A0 =C2=A0 </span><span style=3D"color:#660">{</span><span=
 style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D=
"color:#008">return</span><span style=3D"color:#000"> constructor</span><sp=
an style=3D"color:#660">(</span><span style=3D"color:#000">memory</span><sp=
an style=3D"color:#660">);</span><span style=3D"color:#000"><br>=C2=A0 =C2=
=A0 </span><span style=3D"color:#660">}</span><span style=3D"color:#000"><b=
r>=C2=A0 =C2=A0 </span><span style=3D"color:#008">catch</span><span style=
=3D"color:#000"> </span><span style=3D"color:#660">(...)</span><span style=
=3D"color:#000"><br>=C2=A0 =C2=A0 </span><span style=3D"color:#660">{</span=
><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span st=
yle=3D"color:#606">VirtualFree</span><span style=3D"color:#660">(</span><sp=
an style=3D"color:#000">memory</span><span style=3D"color:#660">,</span><sp=
an style=3D"color:#000"> </span><span style=3D"color:#066">0</span><span st=
yle=3D"color:#660">,</span><span style=3D"color:#000"> MEM_RELEASE</span><s=
pan style=3D"color:#660">);</span><span style=3D"color:#000"><br>=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#008">throw</span><span style=
=3D"color:#660">;</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 </span=
><span style=3D"color:#660">}</span><span style=3D"color:#000"><br></span><=
span style=3D"color:#660">}</span><span style=3D"color:#000"><br><br></span=
><span style=3D"color:#008">template</span><span style=3D"color:#000"> </sp=
an><span style=3D"color:#660">&lt;</span><span style=3D"color:#008">typenam=
e</span><span style=3D"color:#000"> </span><span style=3D"color:#606">Type<=
/span><span style=3D"color:#660">,</span><span style=3D"color:#000"> </span=
><span style=3D"color:#008">typename</span><span style=3D"color:#000"> </sp=
an><span style=3D"color:#606">Destructor</span><span style=3D"color:#660">&=
gt;</span><span style=3D"color:#000"><br></span><span style=3D"color:#008">=
void</span><span style=3D"color:#000"> </span><span style=3D"color:#008">op=
erator</span><span style=3D"color:#000"> </span><span style=3D"color:#008">=
delete</span><span style=3D"color:#000"> valloc_delete</span><span style=3D=
"color:#660">(</span><span style=3D"color:#606">Type</span><span style=3D"c=
olor:#000"> </span><span style=3D"color:#660">*</span><span style=3D"color:=
#008">object</span><span style=3D"color:#660">,</span><span style=3D"color:=
#000"> </span><span style=3D"color:#008">const</span><span style=3D"color:#=
000"> </span><span style=3D"color:#606">Destructor</span><span style=3D"col=
or:#000"> </span><span style=3D"color:#660">&amp;</span><span style=3D"colo=
r:#000">destructor</span><span style=3D"color:#660">)</span><span style=3D"=
color:#000"><br></span><span style=3D"color:#660">{</span><span style=3D"co=
lor:#000"><br>=C2=A0 =C2=A0 </span><span style=3D"color:#008">if</span><spa=
n style=3D"color:#000"> </span><span style=3D"color:#660">(</span><span sty=
le=3D"color:#008">object</span><span style=3D"color:#000"> </span><span sty=
le=3D"color:#660">=3D=3D</span><span style=3D"color:#000"> </span><span sty=
le=3D"color:#008">nullptr</span><span style=3D"color:#660">)</span><span st=
yle=3D"color:#000"><br>=C2=A0 =C2=A0 </span><span style=3D"color:#660">{</s=
pan><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </span><span=
 style=3D"color:#008">return</span><span style=3D"color:#660">;</span><span=
 style=3D"color:#000"><br>=C2=A0 =C2=A0 </span><span style=3D"color:#660">}=
</span><span style=3D"color:#000"><br><br>=C2=A0 =C2=A0 </span><span style=
=3D"color:#800">// Get the base address of the most-derived object</span><s=
pan style=3D"color:#000"><br>=C2=A0 =C2=A0 </span><span style=3D"color:#008=
">void</span><span style=3D"color:#000"> </span><span style=3D"color:#660">=
*</span><span style=3D"color:#000">memory </span><span style=3D"color:#660"=
>=3D</span><span style=3D"color:#000"> </span><span style=3D"color:#008">co=
nst_cast</span><span style=3D"color:#660">&lt;</span><span style=3D"color:#=
000">std</span><span style=3D"color:#660">::</span><span style=3D"color:#00=
0">remove_cv_t</span><span style=3D"color:#660">&lt;</span><span style=3D"c=
olor:#606">Type</span><span style=3D"color:#660">&gt;</span><span style=3D"=
color:#000"> </span><span style=3D"color:#660">*&gt;(</span><span style=3D"=
color:#008">object</span><span style=3D"color:#660">);</span><span style=3D=
"color:#000"><br>=C2=A0 =C2=A0 </span><span style=3D"color:#008">if</span><=
span style=3D"color:#000"> </span><span style=3D"color:#660">(</span><span =
style=3D"color:#000">std</span><span style=3D"color:#660">::</span><span st=
yle=3D"color:#000">is_polymorphic</span><span style=3D"color:#660">&lt;</sp=
an><span style=3D"color:#606">Type</span><span style=3D"color:#660">&gt;::<=
/span><span style=3D"color:#000">value</span><span style=3D"color:#660">)</=
span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 </span><span style=3D"col=
or:#660">{</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0=
 memory </span><span style=3D"color:#660">=3D</span><span style=3D"color:#0=
00"> </span><span style=3D"color:#008">dynamic_cast</span><span style=3D"co=
lor:#660">&lt;</span><span style=3D"color:#008">void</span><span style=3D"c=
olor:#000"> </span><span style=3D"color:#660">*&gt;(</span><span style=3D"c=
olor:#008">const_cast</span><span style=3D"color:#660">&lt;</span><span sty=
le=3D"color:#000">std</span><span style=3D"color:#660">::</span><span style=
=3D"color:#000">remove_cv_t</span><span style=3D"color:#660">&lt;</span><sp=
an style=3D"color:#606">Type</span><span style=3D"color:#660">&gt;</span><s=
pan style=3D"color:#000"> </span><span style=3D"color:#660">*&gt;(</span><s=
pan style=3D"color:#008">object</span><span style=3D"color:#660">));</span>=
<span style=3D"color:#000"><br>=C2=A0 =C2=A0 </span><span style=3D"color:#6=
60">}</span><span style=3D"color:#000"><br><br>=C2=A0 =C2=A0 destructor</sp=
an><span style=3D"color:#660">(</span><span style=3D"color:#008">object</sp=
an><span style=3D"color:#660">);</span><span style=3D"color:#000"><br><br>=
=C2=A0 =C2=A0 </span><span style=3D"color:#606">VirtualFree</span><span sty=
le=3D"color:#660">(</span><span style=3D"color:#000">memory</span><span sty=
le=3D"color:#660">,</span><span style=3D"color:#000"> </span><span style=3D=
"color:#066">0</span><span style=3D"color:#660">,</span><span style=3D"colo=
r:#000"> MEM_RELEASE</span><span style=3D"color:#660">);</span><span style=
=3D"color:#000"><br></span><span style=3D"color:#660">}</span></div></code>=
</div><br><br><br>Now <span style=3D"font-family:courier new,monospace">val=
loc_new</span> and <span style=3D"font-family:courier new,monospace">valloc=
_delete</span> in the proper scope will syntactically function the same way=
 as the <span style=3D"font-family:courier new,monospace">new</span> and <s=
pan style=3D"font-family:courier new,monospace">delete</span> keywords, in =
a way becoming keywords themselves.=C2=A0 I think that it would be worthwhi=
le to allow these to be scoped to namespaces or classes.<br><br>The private=
 constructor/destructor problem is solved, because they are passed in as la=
mbdas (or function pointers, at implementation discretion).<br><br>We can r=
edefine the basic implementation of the &quot;new&quot; keyword to be an im=
plementation-defined template function that calls <span style=3D"font-famil=
y:courier new,monospace">::operator new(size_t)</span> and does other thing=
s, like <span style=3D"font-family:courier new,monospace">dynamic_cast&lt;v=
oid *&gt;</span> if the type is polymorphic.=C2=A0 Overriding the global ne=
w would work by replacing this template or its overloads.<br><br><div style=
=3D"background-color:rgb(250,250,250);border-color:rgb(187,187,187);border-=
style:solid;border-width:1px;word-wrap:break-word"><code><div><span style=
=3D"color:#008">template</span><span style=3D"color:#000"> </span><span sty=
le=3D"color:#660">&lt;</span><span style=3D"color:#008">typename</span><spa=
n style=3D"color:#000"> </span><span style=3D"color:#606">Type</span><span =
style=3D"color:#660">,</span><span style=3D"color:#000"> </span><span style=
=3D"color:#008">typename</span><span style=3D"color:#000"> </span><span sty=
le=3D"color:#606">Constructor</span><span style=3D"color:#660">,</span><spa=
n style=3D"color:#000"> </span><span style=3D"color:#008">typename</span><s=
pan style=3D"color:#660">...</span><span style=3D"color:#000"> </span><span=
 style=3D"color:#606">Args</span><span style=3D"color:#660">&gt;</span><spa=
n style=3D"color:#000"><br></span><span style=3D"color:#606">Type</span><sp=
an style=3D"color:#000"> </span><span style=3D"color:#660">*</span><span st=
yle=3D"color:#008">operator</span><span style=3D"color:#000"> </span><span =
style=3D"color:#008">new</span><span style=3D"color:#000"> </span><span sty=
le=3D"color:#008">new</span><span style=3D"color:#660">(</span><span style=
=3D"color:#008">const</span><span style=3D"color:#000"> </span><span style=
=3D"color:#606">Constructor</span><span style=3D"color:#000"> </span><span =
style=3D"color:#660">&amp;</span><span style=3D"color:#000">constructor</sp=
an><span style=3D"color:#660">,</span><span style=3D"color:#000"> </span><s=
pan style=3D"color:#606">Args</span><span style=3D"color:#000"> </span><spa=
n style=3D"color:#660">&amp;&amp;...</span><span style=3D"color:#000">args<=
/span><span style=3D"color:#660">)</span><span style=3D"color:#000"><br>=C2=
=A0 =C2=A0 noexcept</span><span style=3D"color:#660">(</span><span style=3D=
"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 noexcept</span><span style=3D"=
color:#660">(</span><span style=3D"color:#000">constructor</span><span styl=
e=3D"color:#660">(</span><span style=3D"color:#008">static_cast</span><span=
 style=3D"color:#660">&lt;</span><span style=3D"color:#606">Type</span><spa=
n style=3D"color:#000"> </span><span style=3D"color:#660">*&gt;(</span><spa=
n style=3D"color:#008">nullptr</span><span style=3D"color:#660">)))</span><=
span style=3D"color:#000"> </span><span style=3D"color:#660">&amp;&amp;</sp=
an><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 noexcept</spa=
n><span style=3D"color:#660">(::</span><span style=3D"color:#008">operator<=
/span><span style=3D"color:#000"> </span><span style=3D"color:#008">new</sp=
an><span style=3D"color:#660">(</span><span style=3D"color:#000">std</span>=
<span style=3D"color:#660">::</span><span style=3D"color:#000">size_t</span=
><span style=3D"color:#660">(),</span><span style=3D"color:#000"> std</span=
><span style=3D"color:#660">::</span><span style=3D"color:#000">forward</sp=
an><span style=3D"color:#660">&lt;</span><span style=3D"color:#606">Args</s=
pan><span style=3D"color:#660">&gt;(</span><span style=3D"color:#000">args<=
/span><span style=3D"color:#660">)...)));</span></div></code></div><br><br>=
Melissa</div><span class=3D"HOEnZb"><font color=3D"#888888">

<p></p>

-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals&quot; group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org" target=3D"_=
blank">std-proposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/" target=3D"_blank">http://groups.google.com/a/isocpp.org/gro=
up/std-proposals/</a>.<br>
</font></span></blockquote></div><br><br clear=3D"all"><div><br></div>-- <b=
r><div class=3D"gmail_signature"><div dir=3D"rtl"><div><div dir=3D"ltr">how=
 am I supposed to end the twisted road of=C2=A0 your hair in such a dark ni=
ght??<br>unless the candle of your face does shed some light upon my way!!!=
<br></div></div></div></div>
</div>

<p></p>

-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals&quot; group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />

--001a114938b4189814051b78d32c--

.
